Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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>

Ответ 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')
           );
        }
    }
}

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