尝试设置phalcon mvc应用程序。
我有2个模块当前设置用于测试。 “前端”和“管理员”。
我设置了不同的视图,因此我可以确认我正在查看每个模块。当我更改defaultnamespace
和defaultmodule
时,我确实可以看到两个模块都被正常访问并加载正常。我可以看到管理控制器正在被正确访问,并且当我更改它时正在访问前端控制器。
我目前遇到的问题是,当我尝试对用户进行身份验证并启动会话时,我想将请求从“前端”转发到“管理员”:
return $this->dispatcher->forward(array(
'namespace' => 'Qcm\Admin\Controllers',
'action' => 'index',
'controller' => 'index'
));
我再次确认这些命名空间工作正常。问题是当我现在转发到新的命名空间时,它再也找不到管理索引控制器了?
"Qcm\Admin\Controllers\IndexController handler class cannot be loaded"
但是我已经确认我可以通过更改defaultnamespace
/ defaultmodule
来切换模块。这是调度员中的限制,我无法转发到其他模块吗?
只是为了澄清我也在使用相同的网址,例如登录后我希望它回到'/'(root),但因为它已经转发到管理模块,这应该工作正常吗?
答案 0 :(得分:2)
phalcon调度程序只能转发到同一模块中的操作。它无法将您转发到当前模块之外。之所以出现这种限制,是因为调度程序只知道声明它的模块。
为了转发到另一个模块,您必须从控制器操作返回重定向响应。就我而言,我想根据插件的beforeDispatch()方法中的ACL权限将用户转发到登录屏幕或404错误页面。调度程序是此方法的原生,但不能将用户转发到当前模块之外。相反,我让调度程序将用户转发到具有自定义操作的同一模块中的控制器,该自定义操作又执行重定向。
// hack to redirect across modules
$dispatcher->forward(
array(
'controller' => 'security',
'action' => 'redirect',
'params' => array(
'redirect' => '/home/index/login'
),
)
);
return false; // stop progress and forward to redirect action
这意味着每个模块都需要在其中一个控制器中拥有此自定义重定向操作的副本。我通过将操作放在我的所有控制器扩展的基本控制器中来实现这一点。
/**
* the phalcon dispatcher cannot forward across modules
* instead, forward to this shared action which can then redirect across modules
* */
public function redirectAction(){
$this->view->disable();
$params = $this->dispatcher->getParams();
$redirect = '/';
if( ! empty( $params['redirect'] ) ){
$redirect = $params['redirect'];
}
return $this->response->redirect( $redirect );
}
答案 1 :(得分:1)
因为phalcon没有将所有模块添加到全局加载器,所以命名空间未注册。您需要在当前模块引导程序文件中注册另一个模块,将Module.php修改为
class Module
{
public function registerAutoloaders()
{
$loader = new \Phalcon\Loader();
$loader->registerNamespaces(array(
//Your current module namespaces here
....
//Another module namespaces here
'Qcm\Admin\Controllers' => 'controller path',
));
$loader->register();
}
}
答案 2 :(得分:0)
它显示未加载IndexController类的主要原因是您可能没有在该模块或引导程序文件中添加Dispatcher(取决于您的方法)
添加
$debug = new \Phalcon\Debug();
$debug->listen();
之前的代码
$application->handle()->getcontent();
查看错误。
答案 3 :(得分:0)
在替换线之前:
echo $application->handle()->getContent();
代码:
$router = $this->getDi()->get("router");
$params = $router->getParams();
$modName = $router->getModuleName();
$url = null;
if ($modName == "admin" && isset($params[0])) {
$module = "/" . $params[0];
$controller = isset($params[1]) ? "/" . $params[1] . "/" : null;
$action = isset($params[2]) ? $params[2] . "/" : null;
$params = sizeof($params) > 3 ? implode("/", array_slice($params, 3)) . "/" : null;
$url = $module . $controller . $action . $params;
}
echo $application->handle($url)->getContent();