我可以在PhalconPHP中使用多个名称空间

时间:2014-02-18 12:21:35

标签: php namespaces phalcon

我正在使用伟大的PhalconPHP Framework。我有不同的用户级别并加载正确的控制器,我在调度程序类中使用名称空间。

$di->set('dispatcher', function() {

    //Create an EventsManager
    $eventsManager = new EventsManager();

    //Remove extension before dispatch
    $eventsManager->attach("dispatch:beforeDispatchLoop", function($event, $dispatcher) {
         switch($user->getUserType()) {
             case 1:
                 //Student
                 $dispatcher->setNamespaceName('student');
                 break;
             case 2:
                  //Userlevel 2, yet to come
                  break;
             case 3:
                 //Admin &| Minion
                 $dispatcher->setNamespaceName('admin');
    }
    });

    $dispatcher = new MvcDispatcher();
    $dispatcher->setEventsManager($eventsManager);

    return $dispatcher;
});

命名空间的注册方式如下:

$loader->registerNamespaces(
    array(  
        'Student' => __DIR__ . '/../../app/controllers/student',
        'Admin' => __DIR__ . '/../../app/controllers/admin,
)

);

这很好但现在我也想要子目录,比如“..controllers / admin / sub”。 “/ sub”中的控制器也必须位于命名空间“admin”中。 (因为调度程序)或者我可以以某种方式执行命名空间Admin / *和php包括所有子目录?

我希望我能解释一下我的问题,有人可以提供帮助。 =)

1 个答案:

答案 0 :(得分:1)

恕我直言,更好的方法是在路由器逻辑域中 - 你的调度员调度它被告知要发送的东西,你的路由器找出要发送的内容并告诉调度员。你在两者之间混合。我会扩展路由器,覆盖handle方法并从那里设置命名空间。路由器需要在DI中注册(否则将使用基站)。

public function handle($uri = null)
{
    parent::handle($uri);

    switch($user->getUserType()) {
         case 1:
             //Student
             $this->_namespace = 'student';
             break;
         case 2:
              //Userlevel 2, yet to come
              break;
         case 3:
             //Admin &| Minion
             $this->_namespace = 'admin';
             break;
    }
}

对于实际问题 - 它还与路由应该如何工作有关。您需要指定sub namespaces in your routes,或者您也可以在handle函数中执行此操作,如下所示。我测试过并且它可以工作,但是在路线中指定它将是将相关逻辑保持在一个地方的更好方法。

public function handle($uri = null)
{
    $this->_controller = 'sub\\' . $this->_controller;
}

编辑:此外,可能不是您想听到的内容,但为您的控制器设置子文件夹可能不是最好的方法。我不知道是否有一个最佳实践,但它似乎事实上是将它们保持在每个模块/应用程序的一个目录中。你可以拥有多个带有自己控制器的模块,Phalcon支持多模块。