1

問題が発生しましたが、それを機能させるための適切な解決策が見つからないようです。Zend Framework プロジェクトにいくつかの動的ルートを作成する必要があります。私の問題が何であるかを簡単に説明します。

デフォルト ルートを「拡張」する動的なカスタム ルートが必要です ( module/controller/action/params)。私が取り組んでいるプロジェクトにはいくつかのパートナーがいて、ルートはそれらと連携する必要があります。パートナーを保存するために、静的クラスを作成しました。これは次のようになります。

<?php
    class App_Partner
    {
        static public $partners = array(
            array(
                'name' => 'partner1',
                'picture' => 'partner1.jpg'
            ),
            array(
                'name' => 'partner2',
                'picture' => 'partner2.jpg'
            ),
            array(
                'name' => 'partner3',
                'picture' => 'partner3.jpg'
            )
        );
        static public function routePartners() {
            $partners = array();

            foreach(self::$partners as $partner) {
                array_push($partners, strtolower($partner['name']));
            }
            $regex = '(' . implode('|', $partners) . ')';

            return $regex;
        }
    }

正しいルートを作成するために使用するApp_Partner::routePartners()ような文字列を返してください。(partner1|partner2|partner3)私の目標は、Bootstrap で設定したすべてのルートの各パートナーのカスタム ルートを持つことです。したがって、ルートadd-product.htmlセットがある場合は、各パートナーに対してpartner1/add-product.htmlpartner2/add-product.htmlおよびとして機能するようにしpartner3/add-product.htmlます。また、partner1/partner2/partner3ルーティングする必要がありdefault/index/indexます。

実際、私は以下のようなルートを使用してこれを機能させました。

<?php
$routeProposal = new Zend_Controller_Router_Route_Regex(
    App_Partner::routePartners() . '?/?proposals.html',
    array(
        'module' => 'default',
        'controller' => 'proposal',
        'action' => 'index',
        'page' => 1
    ),
    array( 1 => 'partner'),
    "%s/proposals.html"
);
$router->addRoute('proposal', $routeProposal);

問題

リクエスト URI でパートナーを使用すると、上記のルートは正常に機能しますが、そうしないと、public//proposals.html上記のルートで設定された逆のルートが"%s/proposals.html". URL ビュー ヘルパーを使用して URL を作成し、逆ルートが設定されていない場合、これを示す例外が発生するため、この逆ルートを回避する方法を見つけることができないようです。

add-product.htmlまた、デフォルトの方法 ( など)になるパートナー セットなしで動作するルートも必要ですproposals.html

4

2 に答える 2

6

あなたの説明から、パートナーがオプションのチェーンであるzend ルーター チェーンを探しているようです。

これは同様の質問ですが、ホスト名 route を使用しています: Zend Framework: get subdomain parameter from route . 私はあなたの問題を解決するためにそれを適応させました。ルーティングを初期化するために Bootstrap.php に以下を入れてください:

protected function _initRoute()
{
    $this->bootstrap('FrontController');
    $router = $this->getResource('FrontController')->getRouter();

    // Default route
    $router->removeDefaultRoutes();
    $defaultRoute = new Zend_Controller_Router_Route(
                    ':controller/:action/*',
                    array(
                        'module' => 'default',
                        'controller' => 'index',
                        'action' => 'index',
                    )
    );
    $router->addRoute('default', $defaultRoute);

    $partnerRoute = new Zend_Controller_Router_Route(
        ':partner',
        array('partner' => 'none'),
        array('partner' => '^(partner1|partner2|partner3)$')
    );
    $router->addRoute('partner', $partnerRoute->chain($defaultRoute));
}

必要に応じて変更してください。コントローラーでは、実際に指定されていて有効な場合にのみ、パートナーパラメーターの値を取得します(パートナーが存在しない場合はルーティングエラーが発生します)...

于 2011-03-17T12:58:50.277 に答える
1

私のルートでは、同様のプロセスを使用してlangをdetechします(ただし、iniファイルを使用します)。

パートナー パラメーターのデフォルト値を使用して、パートナーなしでルートを機能させ?、正規表現に を追加できます。

でも実はダブル回避の方法がわからない//

それが役立つことを願っています。

編集:参考までに、ここに言語を含む私のルートの簡略化されたバージョンがあります:

routes.lang.type = "Zend_Controller_Router_Route"
routes.lang.route = "lang/:language/*"
routes.lang.reqs.language = "^(en|fr|nl|de)?$"
routes.lang.defaults.language = none
routes.lang.defaults.module = default
routes.lang.defaults.controller = index
routes.lang.defaults.action = language
于 2011-03-17T09:10:31.243 に答える