2

私はちょうど今、Phalcon を使ってバタバタしていて、大きなプロジェクトを CodeIgniter から Phalcon や別のフレームワークに移植してから開発を続けることを考えているので、頭を悩ませようとしています。

ルーターを使用して 404 エラーを検出しようとしていますが、期待どおりに動作しません。index.php が定義されていない場合は、サイト インデックス コントローラーもフェッチする必要があるため、ルーター自体が機能$router->add("/"しているようです。それをコメントアウトすると、home/ に移動すると 404 がスローされます。ただし、test などの存在しないコントローラー名を入力すると、「PhalconException: TestController ハンドラー クラスをロードできません」というエラーが表示されます。私の htaccess は Phalcon docs チュートリアルの通りです。

ブートストラップ (index.php) には、次のようなものがあります。

$di->set('router', function() { require __DIR__ . '/../app/config/routes.php'; return $router; });

そして、私のroutes.phpは次のようになります。

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

// default
$router->add("/", array(
    'controller' => 'index',
    'action' => 'index'
));

//Set 404 paths
$router->notFound(array(
    "controller" => "group",
    "action" => "index"
));

$router->handle();
return $router;

このサイトには、domain.com/group-name/ によって到達されるユーザーが送信したグループがあります。CI では、404 ルーティングを使用して、そのグループの検索をアクティブにするグループ コントローラーをロードしていました。見つかった場合はグループを表示し、見つからない場合は 404 ヘッダーを含む 404 ページをスローします。Phalcon でそれを行うためのより良い方法があるかもしれませんが、少なくとも私の notFound ルーティングが機能しない理由を知りたいです ;)

編集:これで何かが変わるかどうかはわかりませんが、すべてのメインコントローラーが拡張しているベースコントローラー「controllerBase」を使用しています。いくつかの変数と初期化関数、およびコントローラーから呼び出すことができる別の関数が含まれているだけです。これが notFound ルーティングに影響を与えるとは思わなかったでしょうが、とにかく言及した方がよいと思いました。

4

3 に答える 3

8

\Phalcon\Mvc\Router のデフォルトの動作では、notFound() メソッドを使用しません。

notFound() を使用したい場合は、ここで説明されているように、最初にデフォルト ルートを無効にする必要があります: http://docs.phalconphp.com/en/latest/reference/routing.html#default-behavior

あなたの例では、次のように変更するだけです。

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

以下に:

$router = new \Phalcon\Mvc\Router(false);
于 2014-05-29T22:12:18.880 に答える
2

これは逆に違いない気がしませんか?ルートがある場合は、404 のようにではなく、ルートのようdomain.com/group-name/に処理する必要があります... グループが見つからない場合にのみ、アプリケーションは 404 で応答する必要があります。より単純で論理的に聞こえます。

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

// group - match any 1+ characters
$router->add("/(.+)", array(
    'controller' => 'group',
    'action' => 'index',
    'params' => 1
));

// default
$router->add("/", array(
    'controller' => 'index',
    'action' => 'index'
));

// action in group controller
public function indexAction($group) {
    if ($this->groupExists($group)) {
        // display it
    } else {
        $this->dispatcher->forward([
            'action'     => 'error404',
            'controller' => 'error'
        ]);
    }
}

// action in error controller
public function error404() {
    // …
    // dispay the error
    // …

    $this->response->setStatusCode(404, 'Not Found');
}

理想的には、404 を処理するためのより優れたメカニズムがあればthrow new NotFoundException();、アクションでヘッダーを管理するだけでなく、管理することもできます。ルートの順序を忘れないでください: を使用して必要に応じて多くのルートを追加できるadd()ため、ルートが追加される順序はそれらの関連性を示し、最後に追加されたルートは最初に追加されたルートよりも関連性が高くなります。

動作しないということに関しては、$router->notFound()何か単純なものが欠けているような匂いがします。名前、パス、および呼び出された順序をトリプルチェックしましたか?

于 2014-05-22T08:03:16.123 に答える
1

$router->handle() の呼び出しが早すぎるようです。

他のプロジェクトが同じことをどのように達成したかを確認するのに役立ちます: https://github.com/phalcon/forum/blob/master/app/config/routes.php

ブートストラップ:

$di->set(
    'router',
    function () {
        return require __DIR__ . '/../app/config/routes.php';
    },
    true
);

ルート:

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

// default
$router->add("/", array(
    'controller' => 'index',
    'action' => 'index'
));

//Set 404 paths
$router->notFound(array(
    "controller" => "group",
    "action" => "index"
));

return $router;

再びブートストラップ:

... end of file ...


echo $application->handle()->getContent();
于 2014-05-22T01:03:15.520 に答える