0

多くのモジュールを使用する大きな ZF2 プロジェクトがあります。

1 つのモジュールのみのコードを使用して、すべてのモジュールの既存のすべてのルートに Optional カスタム ルートを自動的に PREPEND する方法を見つける必要があります。

また、Url ビュー ヘルパーと連携する必要があります。

すべてのモジュールには、基本的に次のデフォルトルートがあります: /ModuleName[/:controller[/:action]]

しかし、私の新しいモジュール (Company) は、次のようにすべてのルートに Company コンテキストを追加する必要があります: [/company/:company_id] /ModuleName[/:controller[/:action]]

お気づきかもしれませんが、/company/id の部分はオプションであり、デフォルトの company_id が必要です。

すべてのモジュールの構成ファイルにこのルートを追加したくありません。

Company モジュールの構成ファイルにルートを追加しようとしましたが、Zend2 は代わりに名前空間を使用するため、ルート定義内で MODULE パラメータを定義できないことがすぐにわかりました。

また、言語についても同じことを行う必要があります。

最後に、次のようなものが必要になります。

[/:lang][/company/:company_id]/ModuleName[/:controller[/:action]]

他の既存のモジュールの現在の構成ファイルを変更せずに。

誰もがこれに対する解決策を持っていますか?

ありがとう !

4

1 に答える 1

0

私は自分の問題を解決しました。誰かが必要な場合はここで共有します。

プロジェクトのビルド方法に大きく依存するため、コード行を投稿せずに大きなアイデアのみを説明します。また、理解を深めるために独自の方法で実装することをお勧めします。それを理解しようとすると、プロジェクト全体が壊れます。とはいえ、この説明が理解できなければ、とにかくこれを実装することはできません。

まず、すべてのモジュール クラスの拡張元となる BaseModule があり、この BaseModule は getConfig() メソッド自体を自動的に実装します。これは最終的なものであるため、どのモジュールもオーバーライドできません。プロジェクトがそのように構築されていない場合、それは機能せず、ここで停止できます。

この BaseModule には、prependRouteSegment() という STATIC メソッドがあります。これは基本的に、key=>array を PRIVATE STATIC 配列変数に追加します。私の場合、キーはルートであり、配列はこのルートのデフォルトのパラメーターです。

次に、getConfig() メソッドで、構成ファイルをフェッチした後、それを構成配列として返す前に、必要なものを何でも編集できます。したがって、基本的に、既存のすべての「セグメント」ルートを編集し、静的変数と元のルートからルートを連結してから、デフォルトのパラメーターを追加します。

しかし、非常に重要なことがもう 1 つあります。zend がすべてのモジュールの getConfig() メソッドを実行する前に、実際に各モジュールからカスタム ルートを設定する必要があります。

これを行うには、まず任意のモジュールでオーバーライドできる STATIC メソッド initCustomRouting() を作成します。次に、最初にロードしたモジュールがアプリケーションであるとします。アプリケーション モジュールの __construct() メソッドでモジュールのリストを解析し、これを initCustomRouting に呼び出します。 () 各モジュールで静的に。

次に、特定のモジュールがカスタム ルートを既存のルートの先頭に追加する必要がある場合は、このモジュールに initCustomRouting() メソッドを実装し、その内部でカスタム ルートとデフォルト パラメータを使用して prependRouteSegment() 静的メソッドを呼び出します。

それでおしまい !

リテラル ルートでは params を使用できないことを忘れないでください。また、ホスト名ルートに何かを追加したくない場合もあります。そのため、私の場合はすべての「セグメント」ルートにルートを追加するだけで、ループするときにタイプを比較するだけです。 .

これが誰かを助けることを願っています!

于 2013-10-18T22:40:31.723 に答える