0

私は CakePHP 2.2 に基づく webapp に取り組んでいます。メインアプリケーションに適合するいくつかのプラグインを作成しました。メイン アプリケーションには動的メニューがあります。ここで、プラグインがこのメニューに op を表示するようにします。

最善の方法は、プラグインにそのメニュー項目をメイン アプリケーションに登録させることだと思います。次に、メイン アプリケーションが (ヘルパーを使用して) メニューを作成します。しかし、これを行う方法がわかりません。AppController に触れていなくても、プラグインがメイン アプリケーションと対話できるようにすることは可能ですか? 現在のプラグイン アクションだけでなく、すべてのプラグインを表示したい。

4

1 に答える 1

1

実装の詳細によって異なります。一般に、プラグインは実際にはプラグインとして表示されます。そのため、利用可能な場合、アプリケーションはそれを使用できます。たとえば、コンセプトコード:

if(pluginAvailable('PagesPlugin')) {
  $this->set('menu', $this->PagesPluginComponent->getMenuItems());
}

アプリケーションはそれに依存できますが、ここにないこともできます。それがプラグインの一般的な概念です。現実の世界では、メニューなしで Web ページを表示することができず、実際の依存関係が作成されるため、はるかに困難です。

プラグインは再利用可能であるべきです。

いくつかのオプション:

完全にプラグインベースのページ構造

テーブルページ自体を持つプラグインを作成します。プラグインには、メニュー項目をロードするコンポーネントと、それらの表示をサポートするヘルパーがあります。

したがって、appcontroller でコンポーネントをロードし、ここで依存関係を設定します。before_filer では、メニュー データをロードしてビューに送信します。

default.ctp (または他のレイアウト ファイル) で、データを使用してプラグイン ヘルパーを呼び出します。

requestAction を実行する

プラグイン コントローラーでメソッドを作成し、requestAction を呼び出します: http://book.cakephp.org/2.0/en/controllers.html#Controller::requestAction

yourplugin/menus/index を呼び出すと、完全な MVC プロセスが返されます。したがって、プラグインのコントローラーはモデルからメニュー項目を取得し、データをそのビューに送信し、index.ctp でメニューをレンダリングします。アプリケーションに完全に完成した HTML 結果が返されます。

ヘルパーだけでプラグインを作成する

モデルにデータが必要な場合、プラグインはあまり役に立ちませんが、それでも: 適切なスタイルのメニューを生成する複雑な関数がある場合は、それをプラグイン ヘルパーに入れることができます。

アプリケーションでは、アプリケーションで自分でロードを行うため、すべての柔軟性があります。ビューに送信しますが、プラグインを使用してメニューをレンダリングします。そうすれば、問題なくメニューヘルパーを再利用できます。

appController にプラグイン appController を拡張させる

好きではありませんが、可能です: プラグインで、メニューの設定やその他すべてを処理する新しい AppController を作成できます。アプリケーション appController は、通常の AppController が Controller を拡張する代わりに、そのバージョンを拡張できます。したがって、次のようになります。 AppController は yourPluginAppController を拡張します。呼び出しと依存関係が表示されなくなり、実際には自動的に追加および実行されるため、このパターンは一般的に好きではありません。

オプション: より柔軟な作業方法のために、CakePHP は新しいイベントhttp://book.cakephp.org/2.0/en/core-libraries/events.htmlを追加しました。これは非常に興味深いものです。たとえば appcontroller に興味深いイベントを配置し、そのプラグインにリスナーをアタッチできます。これにより、これらのメソッドをハードコードで呼び出す必要がなくなります。それでうまくいくかもしれませんが、それはかなり新しく、真新しいためいくつかの不具合があります. ドキュメントはまだ完成しておらず、証明された使用法はあまりリリースされていません。

于 2012-10-20T10:15:22.207 に答える