2013-03-15 11 views
8

私は古いコードベースをSymfony 2.2フレームワークに移しています。ビジネスロジックを配置する場所はSymfony 2モデル層ですか?

私の以前のコードでは、記事エンティティのメソッドがgetUrl()で、現在の記事のURLを返していました。

symfonyでは、このようなURLを生成するためにルータサービスを利用する必要があります。

エンティティの内部からルータにアクセスすることはできません。これは悪い習慣であり、フレームワークによって実際にはサポートされていません。

Twigヘルパーpath()を使用してTwigテンプレート自体からルータを呼び出すことができ、URLを構築するために必要なすべての引数(Articleインスタンスから)を提供できます。しかし、この方法はあまり良くありません。なぜなら、URLの書式設定ルールを変更することになるからです。私はこの呼び出しをすべて見つけて書き直す必要があります(DRY)。

私は本当にここでビジネスロジックのカプセル化を保存し、ビューレイヤーにすべての勇気を引いてはいけません。

この状況ではどうすればよいですか?

答えて

11

サービス層にArticleManagerクラスを作成し、そこでビジネスロジックを処理します。あなたはそれに依存性注入を介してルータを渡すことができます。ご例えば

ArticleManager$articleの性質に基づいてURLを生成し、それを返すために(あなたはどちらか__constructまたは別のsetterメソッドを介して注入することを)ルータインスタンスを使用するgetUrl(Article $article)方法を持っているでしょう。

この方法は、ビジネスロジックがビューレイヤーまたはコントローラーレイヤーを汚染しないようにします。

Service Container docsを必ずお読みください。

+0

ありがとうございます!私はこのアプローチについて考えていましたが、もっと経験豊富な人からの確認が必要でした) 私は、他のクラスのモデルエンティティを管理することに本当に心地よいとは思いませんが、これは実行可能なオプションのようです。 –

+0

アクティブレコードORMから来ている場合、これは間違いなく外国のアプローチのように感じます。しかし、時間の経過とともに心配することを感謝し、これまでにどのように管理したか疑問に思う; –

+0

@SlavaFominIIこれは良い解決策ですが、同じ "モデル"オブジェクトを持っている場合は、同じMangerにプールしてください。 – DonCallisto

関連する問題