0

複数のモジュールとすべてのモジュールを備えたZendProjectには、独自のroutes.iniが定義されています。そして、すべてのroutes.iniファイルは、モジュールベースのブートストラップファイルで次のスクリプトを使用してロードされています。

 protected function _initRoutes() {
            $frontController = Zend_Controller_Front::getInstance();
            $router = $frontController->getRouter();
            $routerDir = realpath(dirname(__FILE__)). "/configs/routes/moduleRoutes.ini";
            $config = new Zend_Config_Ini($routerDir,'production');
            $router->addConfig($config,'routes');
    }

およびすべてのルートが順序なしでロードされています。ルートはロードされた順序の逆の順序でチェックされ、最初にそれらのルートをチェック/実行し、後でチェック/実行する必要があるためです。

各モジュールのroutes.iniファイルのすべてのルートにorderByビット(1,2,3,4 ...)を追加し、特定の順序でロードして、ルートを順番にチェックする方法はありますか?定義。

モジュールの典型的なroutes.iniファイルは次のようになります。

routes.frontindex.type = "Zend_Controller_Router_Route_Regex"
routes.frontindex.route = "/?(?!login/)([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([0-9_-]+)?"
routes.frontindex.defaults.module = mymodule1
routes.frontindex.defaults.controller = mycontroller1
routes.frontindex.map.page = 1

routes.siteimage.type = "Zend_Controller_Router_Route_Regex"
routes.siteimage.route = "siteimage/?([a-zA-Z0-9_-]+)?/?(jpg|png|gif)?"
routes.siteimage.defaults.module = mymodule1
routes.siteimage.defaults.controller = mycontroller2
routes.siteimage.defaults.action = getimage
routes.siteimage.map.imageid = 1


routes.sitemapseo.type = "Zend_Controller_Router_Route_Static"
routes.sitemapseo.route = "sitemap.xml"
routes.sitemapseo.defaults.module = mymodule1
routes.sitemapseo.defaults.controller = mycontroller3
routes.sitemapseo.defaults.action = sitemap
4

3 に答える 3

0

順番は指定できないと思います。これを行うには、独自のコードを作成する必要があります。複数の方法があると思いますが、カスタムZend Controller Pluginを作成することを検討しましたか? routeStartup()ルートを作成して、メソッド内でルートを組み立てることができます。

于 2012-06-20T18:12:34.197 に答える
0

また、application.ini でルートに優先度を設定しようとしました。

そのために、 のコードを読みましたZend_Controller_Router_Rewrite。重要な機能はaddRoute()route()です。私の結論は非常に単純です。ルートは、application.ini の順序とは逆の順序で評価されます。

例 :

application.ini に書くと

ルートA

ルートB

ルートC

最初にrouteCがチェックされ、次にrouteBがチェックされ、最後にrouteAがチェックされます。

優先ルートC > 優先ルートB > 優先ルートA

于 2014-04-07T15:12:25.387 に答える
0

それは可能ですが、多少の作業が必要であり、ZF にかなり慣れている必要があります。

拡張Zend_Controller_Router_Rewriteして独自のルーター クラスを作成する必要があります (ブートストラップでフロント コントローラーの setRouter() メソッドを使用して設定する必要があります)。ルーター クラスでは、次のことを行います。

  • メソッドを拡張して、addRoute優先度を示す 3 番目のパラメーターを追加します。(これは などの定数Your_Router::HIGH_PRIORITYYour_Router::MEDIUM_PRIORITYまたは単に数値である可能性があります)。既存のメソッドがルートを という配列に格納していることがわかります_routes。代わりに、優先度パラメーター (など)$this->_highPriorityRoutesに応じて異なる配列にルートを格納できます。$this->_lowPriorityRoutes

  • メソッドを拡張しroute()ます。残念ながら、そのほとんどはカットアンドペーストになります。array_reverseしかし、これらを呼び出して$this->_routesループし、マッチングを行うことがわかります。最終結果が最初に最も優先度の高いルートを持つ配列になるように、ルート配列を一緒にマージする必要があります。したがって、次のような結果になる可能性があります。

    $routes = array_merge($this->_lowPriorityRoutes, $this->_highPriorityRoutes);
    $routes = array_reverse($routes, true);
    
    foreach ($routes as $name => $route) {
        (...as before)
    
  • ini ファイルを更新して、優先度を示すパラメーターをルートに追加します。addConfig()次に、ルーター クラスのメソッドを拡張して、このパラメーターをaddRoute()メソッドに渡します。

幸運を!

于 2012-06-20T20:56:21.003 に答える