21

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

4

4 に答える 4

47

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

アプリケーションをブートストラップするとき、これを行うことができます(これ$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>
于 2012-12-28T14:47:32.797 に答える
5

Dimopoulos が提案した解決策は機能しません。循環状態を生成します。

Phalcon Router コンポーネントには、次のパターンに一致する URI を常に期待する非常に単純なルーティングを提供するデフォルトの動作があります: /:controller/:action/:params。サーバーが定義されたルートに一致しない URL の要求を受信すると、Phalcon は存在しないコントローラーを検索するため、これは多くの問題を引き起こします。

したがって、まず、この動作を無効にする必要があります。FALSEこれは、次のように Router インスタンスの作成中に渡すことができます。

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

この時点で、@Nguyễn Trọng Bằng によって提案されたソリューションを使用できます。

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

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

これは最も簡単なソリューションであるだけでなく、機能する唯一のソリューションです。

于 2014-07-14T14:51:31.393 に答える