如果控制器/操作不存在,如何在Phalcon中设置404页面?
答案 0 :(得分:41)
您可以设置调度程序为您执行此操作。
当您引导应用程序时,您可以执行此操作($di
是您的DI工厂):
use \Phalcon\Mvc\Dispatcher as PhDispatcher;
$di->set(
'dispatcher',
function() use ($di) {
$evManager = $di->getShared('eventsManager');
$evManager->attach(
"dispatch:beforeException",
function($event, $dispatcher, $exception)
{
switch ($exception->getCode()) {
case PhDispatcher::EXCEPTION_HANDLER_NOT_FOUND:
case PhDispatcher::EXCEPTION_ACTION_NOT_FOUND:
$dispatcher->forward(
array(
'controller' => 'error',
'action' => 'show404',
)
);
return false;
}
}
);
$dispatcher = new PhDispatcher();
$dispatcher->setEventsManager($evManager);
return $dispatcher;
},
true
);
创建ErrorController
<?php
/**
* ErrorController
*/
class ErrorController extends \Phalcon\Mvc\Controller
{
public function show404Action()
{
$this->response->setStatusCode(404, 'Not Found');
$this->view->pick('404/404');
}
}
和404视图(/views/404/404.volt
)
<div align="center" id="fourohfour">
<div class="sub-content">
<strong>ERROR 404</strong>
<br />
<br />
You have tried to access a page which does not exist or has been moved.
<br />
<br />
Please click the links at the top navigation bar to
navigate to other parts of the site, or
if you wish to contact us, there is information in the About page.
<br />
<br />
[ERROR]
</div>
</div>
答案 1 :(得分:12)
您可以使用路由来处理404找不到的页面:
$router->notFound(array(
"controller" => "index",
"action" => "route404"
));
参考:http://docs.phalconphp.com/en/latest/reference/routing.html#not-found-paths
答案 2 :(得分:5)
Dimopoulos提出的解决方案并不起作用。它会产生循环条件。
Phalcon路由器组件具有默认行为,提供非常简单的路由,始终需要与以下模式匹配的URI:/:controller /:action /:params。这将导致许多问题,因为当服务器收到不匹配任何已定义路由的URL请求时,Phalcon将搜索一个不存在的控制器。
因此,首先,必须禁用此行为。这可以在创建路由器实例期间传递FALSE
,如下所示:
$router = Phalcon\Mvc\Router(FALSE);
此时您可以使用@NguyễnTrọngBằng提出的解决方案。
$router->notFound(
[
"namespace" => "MyNamespace\Controller"
"controller" => "index",
"action" => "route404"
]
);
重要的是要注意,如果您使用命名空间,调度程序将无法找到控制器,除非您指定它,就像我上面所做的那样。
这不仅是最简单的解决方案,而且是唯一可行的解决方案。
答案 3 :(得分:3)
您还可以使用
在errorController中设置标头class ErrorController extends ControllerBase
{
public function error404Action()
{
$this->response->setHeader('HTTP/1.0 404','Not Found');
// $this->response->setHeader(404, 'Not Found'); <- did not work
}
}
之前,在发生错误的控制器中,您可以转发到此错误控制器。
class IndexController extends ControllerBase
{
public function indexAction()
{
$id = (int)$this->getId($param);
if ($id > 0) {
// do you stuff
} else {
$this->dispatcher->forward(array(
'controller' => 'error', 'action' => 'error404')
);
}
}
}
这是一种快速而肮脏的(?)方式并且很好,如果你从数据库获取内容并想要抛出错误,如果没有找到。