Как установить 404 страницу в Phalcon для отображения, когда контроллер/действие не существует?
Как настроить страницу 404 в Phalcon
Ответ 1
Вы можете настроить диспетчер для этого.
Когда вы загружаете приложение, вы можете это сделать ($di
- ваш DI factory):
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>
Ответ 2
Вы можете использовать маршрутизацию для обработки 404 не найденной страницы:
$router->notFound(array(
"controller" => "index",
"action" => "route404"
));
Ссылка: http://docs.phalconphp.com/en/latest/reference/routing.html#not-found-paths
Ответ 3
Решение, предложенное Dimopoulos, не работает. Он генерирует условие циклизации.
Компонент Phalcon Router имеет поведение по умолчанию, обеспечивающее очень простую маршрутизацию, которая всегда ожидает URI, который соответствует следующему шаблону:/: controller/: action/: params. Это вызовет много проблем, потому что Phalcon будет искать контроллер, который не существует, когда сервер получает запрос на URL-адрес, который не соответствует определенному маршруту.
Итак, прежде всего, вы должны отключить это поведение. Это можно сделать, передав FALSE
во время создания экземпляра Router следующим образом:
$router = Phalcon\Mvc\Router(FALSE);
На этом этапе вы можете использовать решение, предложенное @Nguyễn Trọng Bằng.
$router->notFound(
[
"namespace" => "MyNamespace\Controller"
"controller" => "index",
"action" => "route404"
]
);
Важно отметить, что если вы используете пространство имен, диспетчер не сможет найти контроллер, если вы не укажете его, как я сделал выше.
Это не только самое простое решение, но и единственное, что работает.
Ответ 4
Вы также можете установить заголовок в 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')
);
}
}
}
Это быстрый и грязный (?) способ, и это хорошо, если вы получаете контент из базы данных и хотите выбросить ошибку, если ничего не найдено.