web-dev-qa-db-ja.com

Phalconで404ページを設定する方法

コントローラー/アクションが存在しない場合に表示されるようにPhalconの404ページを設定するにはどうすればよいですか?

20

あなたはあなたのためにそれをするようにディスパッチャを設定することができます。

bootstrapアプリケーションの場合、これを行うことができます($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>
43

ルーティングを使用して、404 notfoundページを処理できます。

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

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

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"
  ]
);

名前空間を使用している場合、上記のように指定しない限り、ディスパッチャはコントローラを見つけることができないことに注意することが重要です。

これは最も簡単な解決策であるだけでなく、機能する唯一の解決策です。

5
noun

次を使用して、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')
           );
        }
    }
}

これは迅速で汚い(?)方法であり、データベースからコンテンツを取得していて、何も見つからなかった場合にエラーをスローしたい場合に適しています。

3
ralusnom