2016-01-21 2 views
1

Я пытаюсь создать компонент ACL как услугу для многомодульного приложения PhalconPHP. Когда я вызываю компонент ACL с базы контроллеров, я получаю сообщение об ошибке, что я не могу повторно объявить класс ACL.PhalconPHP - Не удается загрузить компонент из DI в контроллере

Любые идеи, как исправить это, и понять логику того, почему он снова инициализируется?

Фатальная ошибка: Невозможно объявить класс X \ Acl \ Acl, так как имя уже используется в C: \ XAMPP \ HTDOCS \ х \ приложение \ Common \ Acl \ Acl.php на линии 12

Обновление: Если я все изменил до «Pacl», тогда он работает. Я предполагаю, что может быть смешение с пространством имен PhalconPHP. Я либо не с помощью пространств имен правильно, или есть ошибка в PhalconPHP 2.1 Beta 2.

/app/common/Acl/Acl.php 
namespace X\Acl; 
use Phalcon\Mvc\User\Component; 
use Phalcon\Acl; 
use Phalcon\Acl\Role as AclRole; 
use Phalcon\Acl\Resource as AclResource; 

/* 
* ACL component 
*/ 
class Acl extends Component { 
    private function initialize() { 
    } 
    public function isAllowed() { 
     die('called'); 
    } 
} 


/app/front/controllers/ControllerBase.php 
namespace X\Front\Controllers; 
use Phalcon\Session as Session; 
use Phalcon\Mvc\Controller; 
use Phalcon\Mvc\Dispatcher; 

class ControllerBase extends Controller { 
    public function beforeExecuteRoute(Dispatcher $dispatcher) { 
     //$this->acl = $this->getDI()->get("acl"); 
     var_dump($this->acl->isAllowed()); //same behavior in both case 
    } 
} 

/app/front/Module.php 
namespace X\Front; 
use Phalcon\DiInterface; 
use Phalcon\Mvc\Dispatcher; 
use X\Acl\Acl as Acl; 

class Module { 
    public function registerAutoloaders() { 
     $loader = new \Phalcon\Loader(); 

     $loader->registerNamespaces(array(
      'X\Front\Controllers' => __DIR__ . '/controllers/', 
      'X\Front' => __DIR__, 
      'X' => __DIR__ . '/../common/' 
     )); 

     $loader->register(); 
    } 
    public function registerServices(DiInterface $di) { 
     $di['acl'] = function() { 
      return new Acl(); 
     }; 
    } 
} 
+0

Try зарегистрировав услугу, как общий сервис .. –

+0

Я думаю, что я перезапись имен ACL с моей как-то .. или есть ошибка в Phalcon 2.1Beta2 .. – Yossi

ответ

2

Это не проблема Phalcon. Посмотрите внимательно на код:

namespace X\Acl; 

use Phalcon\Acl; 

class Acl extends ... { 

} 

Что Acl переводчик должен использовать? X\Acl\Acl или Phalcon\Acl? Та же ошибка, которую вы получите, например, для следующего кода

namespace My\Awesome\Ns; 

use Some\Name; # Name 1 

class Name # Name 2 
{ 

} 
+1

Большое спасибо, даже не заметил, что :) – Yossi

Смежные вопросы