PhalconPHP - 无法从控制器中的DI加载组件

时间:2016-01-21 12:14:16

标签: php namespaces

我正在尝试为多模块PhalconPHP应用程序创建ACL组件作为服务。当我从Controller Base调用ACL组件时,我收到一条错误,我无法重新声明ACL类。

任何想法如何修复它,并理解为什么再次重新初始化它的逻辑?

致命错误:无法声明类X \ Acl \ Acl,因为该名称已在第12行的C:\ xampp \ htdocs \ x \ app \ common \ Acl \ Acl.php中使用

更新: 如果我将所有内容都更改为“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();
        };
    }
}

1 个答案:

答案 0 :(得分: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
{

}