Zend framework:デフォルトルートの削除
-
07-07-2019 - |
質問
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);
}
これにより、ルートに一致しないルートはデフォルトのエラーハンドラを使用します。