質問

Zend FW 1.9.2を使用していますが、デフォルトルートを無効にし、独自のルートを提供したいです。デフォルトの/:controller /:actionルーティングが本当に嫌いです。

アイデアは、初期化時にルートをインジェクトすることであり、リクエストがインジェクトされたルートの1つにルーティングできない場合、エラーコントローラーに転送する必要があります。 (デフォルトで登録するZend_Controller_Plugin_ErrorHandlerを使用して)

これはすべて正常に動作します。まで $ router-> removeDefaultRoutes();でデフォルトルートを無効にします。 これを行うと、エラーコントローラーはルーティングされていない要求をエラーコントローラーにルーティングしなくなります。代わりに、未ルーティングのすべてのリクエストをデフォルトのコントローラーのindexActionにルーティングします。

デフォルトの/:controller /:actionルーティングを無効にする方法はありますが、ルートのエラー処理は維持しますか?

基本的に、これは私がしていることです:

$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected

$route = new Zend_Controller_Router_Route_Static(
    '',
    array('controller' => 'content', 'action' => 'home')
);
$router->addRoute('home', $route);
役に立ちましたか?

解決

デフォルトルートを削除すると、Zendはurls /:module /:controller /:actionを認識できなくなるため、ルートが送信されるたびに、デフォルトモジュール、インデックスコントローラー、インデックスアクションにルーティングされます。

エラープラグインは、コントローラーディスパッチのpostDispathメソッドで機能します。標準ルーターでは、コントローラー、モジュール、またはアクションが見つからない場合、エラーがスローされるためです。

この構成でカスタムルートを有効にするには、preDispatchで動作する新しいプラグインを作成し、ルートが無効なURLである場合にルートを確認してからエラープラグインにリダイレクトする必要があります。

他のヒント

デフォルトルートを削除すると、エラーハンドラプラグインが使用するデフォルトルートが削除されます。これは、ルーティングしようとするときに

array('module' => 'default, 'controller' => 'error', 'action' => 'index')

この設定に一致するルートはありません。したがって、失敗します。次のようにデフォルトからこのルートを追加できると思います:

$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected
// Re-add the error route 
$router->addRoute(
   'error', 
    new Zend_Controller_Router_Route (
       'error/:action',
       array (
          'controller' => 'error',
          'action' => 'error'
       )
    )
);

$route = new Zend_Controller_Router_Route_Static(
    '',
    array('controller' => 'content', 'action' => 'home')
);
$router->addRoute('home', $route);

古いアプリケーションでも同じ問題が発生しました。ここで問題を解決しました:

$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();
$route = new Zend_Controller_Router_Route('*', array('controller'=>'error', 'module'=>'error', 'action'=>'notfound'));
$router->addRoute('default', $route);
// After that add your routes.

最後に処理する必要があるため、最初にこのルートを追加する必要があります。

そして、ErrorControllerで定義したもの:

public function notfoundAction()
{
    throw new Zend_Controller_Action_Exception('This page does not exist', 404);
}

これにより、ルートに一致しないルートはデフォルトのエラーハンドラを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top