2016-01-21 19 views
1

我想創建一個ACL組件作爲服務,用於多模塊PhalconPHP應用程序。當我從Controller Base調用ACL組件時,出現一個錯誤,我無法重新聲明ACL類。PhalconPHP - 無法從控制器的DI中加載組件

任何想法如何解決它,並理解爲什麼它重新初始化的邏輯?

致命錯誤:無法聲明類X \的Acl \的Acl因爲這個名字已經在C使用:\ XAMPP \ htdocs中\ X \程序\ 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

嘗試同樣的錯誤.. –

+0

我想我覆蓋ACL命名空間我自己莫名其妙..或有錯誤的費爾康2.1Beta2 .. – Yossi

回答

2

這不是Phalcon問題。在你的代碼仔細看看:

namespace X\Acl; 

use Phalcon\Acl; 

class Acl extends ... { 

} 

解釋應該使用什麼的Acl? X\Acl\AclPhalcon\Acl? 您通過註冊服務作爲共享服務中獲得例如以下代碼

namespace My\Awesome\Ns; 

use Some\Name; # Name 1 

class Name # Name 2 
{ 

} 
+1

非常感謝,甚至沒有注意到:) – Yossi

相關問題