我正在使用伟大的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包括所有子目录?
我希望我能解释一下我的问题,有人可以提供帮助。 =)
答案 0 :(得分:1)
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支持多模块。