2

カスタムルートを考え出そうとして、Zendフレームワーク1.12を使用しています。

Facebook のプロフィール URL ( http://facebook.com/username )のようなものを作成しようとしています。だから、最初に私はそのようなことを試しました:

$router->addRoute(
            'eventName',
            new Zend_Controller_Router_Route(
                '/:eventName', 
                array(
                    'module' => 'default', 
                    'controller' => 'event', 
                    'action' => 'detail'
                )
            )
        );

mydomain.com/something を実行しようとするたびに、次のエラーが発生し続けました。

致命的なエラー: 336 行目の /var/desenvolvimento/padroes/zf/ZendFramework-1.12.0/library/Zend/Controller/Plugin/Broker.php のメッセージ「eventName is not specified」を含む例外「Zend_Controller_Router_Exception」をキャッチできませんでした

そのコードを機能させることができなかっただけでなく、すべてのデフォルト ルートが (明らかに) 上書きされていました。したがって、たとえば、「mydomain.com/admin」のようなものがあり、インデックスコントローラーの「admin」モジュールに送信されますが、同じエラーが返されました (/: と同じパターンに陥ったため)。イベント名)。

私がする必要があるのは、デフォルトのものを上書きせずに、実際に動作することなく、このカスタムルートを作成することです (dûh)。

私はすでにオンラインドキュメントとGoogleの多くの(A LOT)ものをチェックしましたが、私が得ているエラーやデフォルトルートを上書きしない方法に関連するものは何も見つかりませんでした. 私を正しい方向に向けてくれるものは何でもありがたいです。

ありがとう。


EDIT¹:なんとか機能させましたが、ルーティングはまったく使用しませんでした。次のプラグインを作成しました。

public function preDispatch(\Zend_Controller_Request_Abstract $request) {

    if (!\Zend_Controller_Front::getInstance()->getDispatcher()->isDispatchable($request)) {

        $request->setModuleName($this->_eventRouter["module"]);
        $request->setControllerName($this->_eventRouter["controller"]);
        $request->setActionName($this->_eventRouter["action"]);

    }

}

しかし、それは醜い回避策のように感じます... Tim Fountainが指摘したように、私のイベントは動的 (データベースからロードする) なので、ハードコードすることはできません。また、現在の実装では、すべてのモジュール/コントローラー/アクションの組み合わせをハードコーディングする必要がありません。

プラグインの使用を避ける方法があれば知りたいです。


EDIT²: 私はもうそのくだらないプラグインのことをしていません。ルーターエラーの原因がわかりました。ルーティング定義に、変数 'eventName' の有効なデフォルト値がありませんでした。私の修正は次のとおりです。

$router->addRoute(
        'eventName',
        new Zend_Controller_Router_Route(
            '/:eventName', 
            array(
                'module' => 'default', 
                'controller' => 'event', 
                'action' => 'detail',
                'eventName' => ''
            )
        )
    );

/admin/:eventNameなどの「競合する」パターンでルートを作成することはまだできません。/adminが/:eventNameを上書きする方法があれば...

4

4 に答える 4

3

ルートは LIFO ベースで適用/照合されます。ルーティング ドキュメントに次のように記載されています。

注:逆マッチング ルートは逆の順序でマッチングされるため、最も一般的なルートが最初に定義されていることを確認してください。

したがって、「静的」ルート (db からプルしないという意味での静的など) を動的ルート ( /admin) に適用するには、実行フローの後半/:eventNameで静的ルートを定義するようにしてください。.

実際には、これはブートストラップ中に静的ルートを定義できないことを意味するため、routeStartupフックを使用してプラグインで定義する必要があります。おそらく、2 つのプラグイン: 1 つは動的ルート用、もう 1 つは静的ルート用です。静的ルートが後で追加されるように、プラグインの優先度が設定されていることを確認してください。

于 2012-11-26T06:50:06.630 に答える
2

発生しているエラーは、おそらくテンプレートにある URL ヘルパー呼び出しから発生しています。必須にしたので、これに eventName パラメータを指定する必要があります。

<a href="<?=$this->url(array('eventName' => 'foo'), 'eventName')?>">Something</a>

他の質問への答えは、静的で変更されていないイベントのリストがあるか、イベント以外の URL があるかによって少し異なります。/fooイベントかコントローラーかを判断する方法をルーターに与える必要があります。これを行うには、可能なイベントをイベント ルートにハードコーディングするか、その他の非イベント URL のルートをハードコーディングするか、または (イベントが動的で、データベース コンテンツに基づいている場合) イベント ルートのカスタム ルート クラスを記述します。特定の文字列がイベントであるかどうかを確認するためにルックアップを実行します。

于 2012-10-30T12:33:31.053 に答える
0

eventName を定義し、必須でなくても空白のままにします。

于 2012-11-26T05:05:05.997 に答える
0

Zend Framework 1.x を使用しているため

ここに追加したソリューションは次のとおりです。Zend Framework 1.xでエラーページをリダイレクトしてルートを実行する方法

また、生活を楽にするために...ここにあります:

I am still unable to create routes with "conflicting" patterns, such as /admin and /:eventName. If only there was a way to make /admin override /:eventName...

eventName を呼び出している場合はaction、その == admin かどうかを確認できます。後で、その条件自体で、ロードする必要があるアクションを指定して再ルートを定義できます。

単純?:)

于 2012-11-23T08:24:19.040 に答える