Как настроить страницу 404 в Phalcon

Как я могу установить страницу 404 в Phalcon для отображения, когда контроллер / действие не существует?

4 ответов


вы можете настроить диспетчера, чтобы сделать это за вас.

при загрузке приложения вы можете сделать это ($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>

вы можете использовать маршрутизацию для обработки страницы 404 not found:

$router->notFound(array(
    "controller" => "index",
    "action" => "route404"
));

Ref:http://docs.phalconphp.com/en/latest/reference/routing.html#not-found-paths


решение, предложенное Димопулос не работает. Оно производит задействуя условие.

компонент маршрутизатора Phalcon имеет поведение по умолчанию, обеспечивающее очень простую маршрутизацию, которая всегда ожидает URI, который соответствует следующему шаблону:/: controller/: action/: params. Это вызовет много проблем, потому что Phalcon будет искать контроллер, который не существует, когда сервер получает запрос на URL-адрес, который не соответствует определенному маршруту.

Итак, во-первых все, ты!--8-->нужно запретить такое поведение. Это можно сделать проходя FALSE во время создания экземпляра маршрутизатора, следующим образом:

$router = Phalcon\Mvc\Router(FALSE);

на данный момент Вы можете использовать решение, предложенное @Nguyễn Trọng Bằng.

$router->notFound(
  [
    "namespace" => "MyNamespace\Controller"
    "controller" => "index",
    "action" => "route404"
  ]
);

важно отметить, что если вы используете пространство имен, диспетчер не сможет найти контроллер, если вы не укажете его, как я сделал выше.

Это не только самое простое решение, но это единственное, что завод.


вы также можете установить заголовок в 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')
           );
        }
    }
}

это быстро и грязно(?) путь и хорош, если вы получаете контент из базы данных и хотите выбросить ошибку, если ничего не найдено.