あなたが提示するすべてのパターン/アーキテクチャは、あなたが従う限り非常に便利だと思います SOLIDの原則に。
ロジックを追加する場所については、単一責任の原則を参照することが重要だと思います。また、私の答えは、あなたが中/大規模のプロジェクトに取り組んでいることを考慮しています。それがページに何かを投げるプロジェクトである場合は、この答えを忘れてすべてをコントローラーまたはモデルに追加してください。
短い答えは次のとおりです。それは、あなたにとって意味のある場所です(サービスについて)。
長い答え:
コントローラー:コントローラーの責任は何ですか?もちろん、すべてのロジックをコントローラーに入れることができますが、それはコントローラーの責任ですか?そうは思いません。
私にとって、コントローラーはリクエストを受け取ってデータを返す必要があり、これは検証を配置したり、dbメソッドを呼び出したりする場所ではありません。
モデル:これは、ユーザーが投稿を登録または投票数を更新したときにウェルカムメールを送信するなどのロジックを追加するのに適した場所ですか?コードの別の場所から同じメールを送信する必要がある場合はどうなりますか?静的メソッドを作成しますか?そのメールに別のモデルの情報が必要な場合はどうなりますか?
モデルはエンティティを表す必要があると思います。Laravelでは、私だけのようなものを追加するモデルクラスを使用しfillable
、guarded
、table
との関係を(これは私がリポジトリパターンを使用しているためで、それ以外のモデルも持っているだろうsave
、update
、find
、などの方法を)。
リポジトリ(Repository Pattern):最初はこれに戸惑いました。そして、あなたのように、私は「まあ、私はMySQLを使用している」と思った。
しかし、私はリポジトリパターンを使用することの長所と短所のバランスをとっており、今ではそれを使用しています。私はと思い、今、この瞬間に、私はMySQLを使用する必要があります。しかし、3年後にMongoDBのようなものに変更する必要がある場合、ほとんどの作業は完了しています。1つの追加インターフェースと1つの$app->bind(«interface», «repository»)
。
イベント(オブザーバーパターン):イベントは、任意のクラスでいつでもスローできるものに役立ちます。たとえば、ユーザーに通知を送信することを考えてください。必要に応じて、イベントを発生させて、アプリケーションの任意のクラスで通知を送信します。次に、UserNotificationEvents
ユーザー通知のすべての発生したイベントを処理するようなクラスを持つことができます。
サービス:これまでは、コントローラーまたはモデルにロジックを追加する選択肢がありました。私にとって、Services内にロジックを追加することはすべて理にかなっています。正直なところ、サービスはクラスのファンシーな名前です。そして、あなたはあなたのアプリケーションの中であなたにとって理にかなっただけ多くのクラスを持つことができます。
この例を見てみましょう:少し前に、Googleフォームのようなものを開発しました。私は開始CustomFormService
となってしまったCustomFormService
、CustomFormRender
、CustomFieldService
、CustomFieldRender
、CustomAnswerService
とCustomAnswerRender
。どうして?それは私には理にかなっているので。チームで作業する場合は、チームにとって意味のある場所にロジックを配置する必要があります。
サービスvsコントローラー/モデルを使用する利点は、単一のコントローラーまたは単一のモデルによる制約を受けないことです。アプリケーションの設計とニーズに基づいて、必要な数のサービスを作成できます。さらに、アプリケーションの任意のクラス内でサービスを呼び出す利点を追加します。
これは長くなりますが、私がアプリケーションをどのように構成したかをお見せしたいと思います。
app/
controllers/
MyCompany/
Composers/
Exceptions/
Models/
Observers/
Sanitizers/
ServiceProviders/
Services/
Validators/
views
(...)
各フォルダを特定の機能に使用します。たとえば、Validators
ディレクトリBaseValidator
には$rules
およびに基づいて検証の処理を担当するクラスが含まれています$messages
特定のバリデータ(各モデルに対して通常1)です。このコードをサービス内に配置することも簡単にできますが、サービス内でのみ使用する場合でも、このための特定のフォルダーを用意することは理にかなっています(現時点では)。
次の記事を読むことをお勧めします。
Dayle Rees(CodeBrightの作者)による型崩し:ニーズに合わせていくつか変更を加えましたが、ここですべてをまとめました。
Chris Gooseyによるリポジトリとサービスを使用してLaravelでコードを分離する:この投稿では、サービスとリポジトリパターンとは何か、およびそれらがどのように組み合わされるかについて説明しています。
Laracastには、リポジトリを簡素化し、単一の責任を負うこともできます。