2

Symfony を使用して、既存のフレームワーク (zikula) で動作を複製しようとしています。このフレームワークは、基本的に拡張された symphony バンドルであるモジュールを使用して拡張可能です。古いフレームワークには次のような URL がありました

index.php?module=foo&type=bar&func=zip

symfony で話すと、大まかに翻訳すると

index.php?bundle=foo&controller=bar&method=zip

フレームワークには、次のような魔法のメソッドを持つ AbstractController があります。

public function __call($method, $args)
{
    $event = new \Zikula\Core\Event\GenericEvent($this, array('method' => $method, 'args' => $args));
    $this->eventManager->dispatch('controller.method_not_found', $event);
    if ($event->isPropagationStopped()) {
        return $event->getData();
    }
}

そのため、バンドルに存在しないメソッドで URL を作成した場合、それをキャプチャするリスナーを作成し、指定された bundle から来たように見えて動作する応答を送信できます。これを使用して、すべてのモジュールで利用でき、別のモジュールで提供されるモジュール サービスを呼び出しますが、それらは「ホスト」モジュールによって提供されるように見えます。

現在、symfony とルーティングを使用してこれを複製しようとしています。

最初の問題は、技術的に存在しないルートを生成することです。これは可能ですか?

2 番目の問題は、RouteNotFoundException をキャプチャすることです (方法はわかっていますが、他の例外のリスナーは既に用意されています)。

最後の問題は、実際にはイベント リスナー (または他の何か) によって応答が提供されているときに、バンドルが応答を提供しているように見せることです。応答の他のコンテンツはモジュール/バンドルから取得する必要があるため、この最後の部分は重要です。

現在のリスナーをコントローラーに変更しようとしました。また、symfony の AbstractController の拡張機能にメソッドを追加しようとしましたが、達成したいことをまだ達成していません。新しいアイデアや試してみるべき方法についての提案を期待しています。

4

1 に答える 1

0

正確な動作を再現することは不可能に思えるので断念しました (説明するのもかなり難しいです)。そのため、標準ルートの通常のコントローラーに頼りましたが、元の「ホスト」モジュールに属しているように見せる方法を見つけました。アイデアを提供してくれた Gerry、ggiooffreda、DerStoffel に感謝します。

于 2015-05-29T19:24:53.813 に答える