2011-01-07 15 views
1

この質問のタイトルは思いつきにくいですが、とにかくそれが最良ではないかもしれません。Zend Framework:完全に動的なルートをマップする方法

私は地域、カテゴリとサプライヤーとのサイトを持って、明白な解決策は、私のURLは、この

"/region/midlands/category/fashion" 
"/region/midlands/supplier/ted-baker" 

ようになりますように

"/:module/:controller/:action" 

のデフォルトルートを使用することです私これを実現するためにはURLフォーマットが必要ですが、これはデータベースクエリを使用して存在を確認する必要があります。midlandsfashionted-baker

"/midlands/fashion" 
"/midlands/ted-baker" 

私のオリジナルのソリューションは、

routes.category.route = "/region/:region/:category" 
routes.category.defaults.controller = category 
routes.category.defaults.action = index 
routes.category.defaults.module = default 
routes.category.defaults.category = false 
routes.category.defaults.region = false 

routes.supplier.route = "/supplier/:supplier" 
routes.supplier.defaults.controller = supplier 
routes.supplier.defaults.action = index 
routes.supplier.defaults.module = default 
routes.supplier.defaults.supplier = false 

として定義されたルートでは、この

"/region/midlands/fashion" 

のようなものを使用することでした。しかし、それはregionまたはsupplierですべてを接頭辞を意味します。私はプラグインでリクエストを完全にハイジャックする必要がほとんどありますか?

これを達成する最良の方法は何ですか?

ありがとうございました。

編集。 St.Woland @

、問題は、私はこのルート

/:region/:supplier 

はこのURL

/midlands/ted-baker 

で作業したいが、そのルートは、効果的にデフォルトルータ

答えて

0

これを最後に行うにはErrorControllerを使用しました。私は、コントローラがあるか経路がないかを例外として捕捉し、それに応じて行動する。

特定のルートのいくつかのデータベーステーブルに対して、St.Wolandのソリューションのようにすべてをフェッチするのではなく、見つからない呼び出しがあります。結果は大量に役立つタグでキャッシュされます。これにより、ルートを検索するためのすべてのデータベースクエリが削除されます。

public function errorAction() 
{ 
    $errors = $this->_getParam('error_handler'); 

    switch ($errors->type) 
    { 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: 
      //Code for locating routes in Db goes here 
    } 
} 
2

無効にすることです最も良い方法は、次のようにBootstrapクラスにメソッドを追加することです:

あなた application.iniでその後

[production] 
bootstrap.path = APPLICATION_PATH/Bootstrap.php 
bootstrap.class = Bootstrap 

これは、データベースからのルートでルータを初期化します。

リクエストごとにデータベースをキューイングするのは効率的ではないので、必ずキャッシュを使用するようにしてください。

+0

こんにちはSt.Woland、問題はルートの追加ではありません。それは、複数の動的ルートを持つ能力をどのように処理すべきかと関係しています。質問の編集を参照してください。 –

+0

すべてのルートは、設定した順序とは反対の順序で集計されます。したがって、あなたのルートがデフォルトルートの後に与えられた場合、最初にマッチします。あなたの望むものがはっきりしないので、それらに合致するすべての経路とURLの例を挙げてください。ありがとう。 –

関連する問題