2011-12-28 9 views
3

Symfony 2.0アプリケーションの構造に関するベストプラクティスに関するガイダンスを探しています。私はいくつかのバンドル(カートバンドル、製品バンドル、CMSバンドル)を持っていて、私のページを作成するときにこれらのバンドルのすべての側面を使用したい場合、どうすればいいのですか?symfonyのバンドル構成、複数のバンドルを使用する場合のコードの構成方法

私はこれを行う2つの方法を想像することができますが、(いずれかの場合)正しいかどうかについてのガイダンスを探しています。

1)私のバンドルのすべての機能をサービスを通じて公開し、これらのサービスをtwig内から直接使用できるようにしてください。この方法で、最も適切なバンドルにルーティング要求を渡すことができます(http://myclient.org/User/Account)。これは、処理するClientUserバンドルに渡されますが、ナビゲーション内にミニショッピングカートを持つ基本テンプレートは、 (これを渡す必要はありません)

2)他のすべてのバンドルにアクセスするバンドルを作成して、ページをビルドします(VendorFrontendやVendorBackendなど)。これは、すべてのルーティング要求がこのバンドルに渡されることを意味し、このバンドルはテンプレートに渡す前にページのすべての部分について必要な情報にアクセスします。

最初のオプションが間違っていると感じました。なぜなら、Twigがサービスを直接消費することを許可することさえできないのかどうかわからないからです(サービスコンテナを介して)?

2番目のオプションは2番目のルータを使用するようなものなので、ルートは別のバンドルを構成するためだけに存在するバンドルに渡されます(このバンドルはバンドルに密接に結合されています使用する)。確かに、これはコードが再利用可能であるという「バンドル」の概念に反するものです。

この例では、デモンストレーションのために非常に簡単なe-comサイトを構築しようとしています。私は基本的なナビゲーション、ミニショッピングカート、ボディとフッタを持つベーステンプレートを持っています。これを/ app/Resourcesディレクトリに保存します。他のすべてのテンプレートにこのテンプレートを継承し、 'body'領域をオーバーライドすることを計画していました。

スプーンフードしたくない、正しい方向のちょっとした動き。ありがとう。

+0

ちょうど非常に古い質問のupvoteを見た。その答えは、必要に応じてサブリクエストを使用し、必要に応じて小枝拡張を使用することです。上記で議論した第2の選択肢は、アプリケーションが成長し始めるときに実行可能なオプションでさえありません。個々のバンドルにもひどく結合しています。 TL; DR。 1 – calumbrodie

答えて

1

"ページ"を生成するには、レンダリングするために必要なテンプレートが含まれている可能性があるすべての変数を一緒に集めなければならないという考え方から離れることが重要だと思います。テンプレート。コントローラーは、サーブしているリクエストに対して特定のものだけを実行する必要があります。 URLに参照されている特定の製品がある場合は、製品を取り出してテンプレートに渡します。特定の製品が参照されていても、それが存在しないか、または表示されるべきでない場合は、404/410 /何かが適切であると回答します。特定のコレクションがある場合は、コレクションをフェッチして渡します。ルーティング/コントローラは、URL自体やHTTPメソッドなどのリクエストをデコードして、それを特定のものに変換する必要があります。特定のリクエストに固有ではなく一般的なものは、そこに属しません。

また、Twigテンプレートから使用するバンドルを抽象化することも重要です。私は、より多くのテンプレートがプッシュされるのではなく、必要なものを「プル」することを提唱していますが、これはDIコンテナを介して、バンドル内のTwig関数の定義によって実現されます現在のリクエストなどになるように変更する可能性があります。つまり、商品カテゴリと関係がある場合は、パラメータとして商品カテゴリオブジェクトを取得させます。

答えは1)2)以上ですが、Twigを通して直接サービスにアクセスすべきではありません - テンプレート内で意味論的な意味を持つ関数を介してプロキシする必要があります。実行時に、あなたが自由に含めたり書き込んだりする新しいバンドルで異なる定義をするサービスです。

+0

具体例。製品ルートにアクセスする場合は、ClientProductBundleを使用してこのリクエストを処理します。私のバンドルは製品オブジェクトを取り出し、これを私のテンプレート(これもClientProductBundleにあります)に渡します。このテンプレートは、/ app/Resourcesから基本テンプレートを拡張します。ユーザーカートのアイテム数を表示するには、どの段階でアクセスする必要がある私の 'ClientCart'バンドルにアクセスしますか?私がこれを行うために見ることができる唯一の方法は、ベーステンプレートがこれに直接アクセスする能力を持つことです。さもなければ、私はClientCartバンドルに(実行パス内の)どこにアクセスできないのですか? – calumbrodie

+0

編集:私のアプローチ(1)は正しいと言いますが、カートサービスに間接的にアクセスする必要がありますか?どの場合、私はこれを(小枝から)行うのですか? – calumbrodie

+0

[この質問](http://stackoverflow.com/questions/8450465/fetching-data-through-a-custom-repository-in-a-twig-extension)の回答はまったく役に立ちますか?ユーザーのカートにアイテムの数を表示する場合は、cart_item_count()などのtwig関数を定義し、カートアクセスサービスを使用してその数にアクセスするように定義することができます。ポイントは、カートのアイテム数は現在のリクエストに固有のものではなく、現在のセッションに固有であるため、コントローラからカート情報を渡すのは意味がないということです。 –

関連する問題