te28

07. アプリケーション層に入る

(jp) =

第 1 章で、ドメイン指向の Laravel プロジェクトの特徴の 1 つを次のように述べました。

[…] 最も重要なことは、同じ技術的特性を持つコードのグループではなく、関連するビジネス コンセプトのグループで考え始めることです。

つまり、コード ベースでの目的ではなく、現実世界での類似性に基づいてコードをグループ化します。

また、ドメイン コードとアプリケーション コードは 2 つの別個のものであると書きました。 さらに、ドメイン機能をエンドユーザーに公開する必要がある場合、アプリケーションはドメインの複数のグループを同時に使用できます。

しかし、このアプリケーション層には正確には何が属しているのでしょうか? そこでコードをグループ化するにはどうすればよいでしょうか。 これらの質問は、この章で回答されます。

アプリケーション層に入ります。

# いくつかのアプリケーション

最初に理解しておくべき重要なことは、1 つのプロジェクトに複数のアプリケーションを含めることができるということです。 実際、すべての Laravel プロジェクトには、デフォルトで HTTP アプリとコンソール アプリの 2 つがあります。 それでも、スタンドアロン アプリと見なすことができるプロジェクトの部分が他にもいくつかあります。すべてのサード パーティの統合、REST API、正面向きのクライアント ポータル、管理者のバック オフィスなどです。

これらはすべて個別のアプリケーションと見なすことができ、独自のユースケースのためにドメインを公開および提示します。 実際、私は職人のコンソールをこのリストの 1 つにすぎないと考える傾向があります。これは、開発者がプロ​​ジェクトを処理および操作するために使用するアプリケーションです。

私たちは Web 開発を行っているため、主な焦点はおそらく HTTP 関連のアプリ内にあります。 それで、それらには何が含まれていますか? みてみましょう:

  • コントローラー
  • リクエスト
  • アプリケーション固有の検証規則
  • ミドルウェア
  • 資力
  • ビューモデル
  • QueryBuilders — URL クエリを解析するもの

ブレード ビュー、JavaScript ファイル、および CSS ファイルはアプリケーション内に属し、アプリケーション内に置いておくべきではないとさえ主張します。 resources フォルダ。 多くの人にとって、これは行き過ぎた一歩だとは思いますが、少なくとも私はそれについて言及したかったのです。

アプリケーションの目標は、ユーザーの入力を取得し、それをドメインに渡し、ユーザーが使用できる方法で出力を表すことです。 ドメイン コードを深く掘り下げた章を何章か読み進めた結果、ほとんどのアプリケーション コードが単に構造的なものであり、退屈なコードであることが多いことは驚くべきことではありません。 あるポイントから別のポイントにデータを渡す。

それでも、上記の概念のいくつかについては、伝えるべきことがたくさんあります。ViewModel、サード パーティの統合、ジョブについてはどうでしょうか。 これらのテーマについては今後の章で取り上げますが、ここでは、アプリケーション層の背後にある主なアイデアと、それらの一般的な概要に焦点を当てたいと思います。

# HTTP アプリケーションの構造化

先に進む前に、議論しなければならない非常に重要な点が 1 つあります。それは、HTTP アプリケーションは一般的にどのように構造化されるかということです。 Laravel の規約に従うべきですか、それとももう少し考える必要がありますか?

章の 1 つのセクションをこの質問に当てているので、おそらく答えは推測できるでしょう。 では、Laravel がデフォルトで推奨することを見てみましょう。

App/Admin
├── Http
│   ├── Controllers
│   ├── Kernel.php
│   └── Middleware
├── Requests
├── Resources
├── Rules
└── ViewModels

この構造は小規模なプロジェクトでは問題ありませんが、正直なところ、うまくスケーリングできません。 これが何を意味するのかを明確にするために、クライアント プロジェクトの 1 つにある管理アプリケーションのドキュメント構造を示します。 明らかに、このプロジェクトについてあまり多くの情報を明らかにすることはできないので、ほとんどのクラス名を黒く塗りつぶしました。 ただし、このシリーズ全体で例として請求書発行を使用してきたため、管理アプリケーション内の請求書関連のクラスをいくつか強調しました。 見てください。

ああ、ハッピースクロール!

App/Admin
├── Controllers
│   ├── █████████
│   │   ├── ███████████████████.php
│   │   ├── ████████████████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── ██████████████████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── █████████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── ███████████████████████████████.php
│   │   ├── ██████████████████.php
│   │   └── ████████████████.php
│   ├── ████████████
│   │   ├── ████████████████████████████████.php
│   │   ├── ████████████████
│   │   │   ├── ████████████████████████████████.php
│   │   │   ├── █████████████████████████████████████████.php
│   │   │   ├── ██████████████████████████████.php
│   │   │   ├── ████████████████████████████████.php
│   │   │   ├── ███████████████████████████████.php
│   │   │   └── ████████████████████████████████.php
│   │   ├── █████████████████████████████████.php
│   │   ├── ██████████████████████████████████.php
│   │   ├── █████████████████████████████████.php
│   │   ├── ██████████████████████████████.php
│   │   ├── █████████████████████████████.php
│   │   ├── █████████████████████████████████████████.php
│   │   ├── █████████████████████████████████████.php
│   │   ├── ██████████████████████████████████.php
│   │   ├── █████████████████████████████████████████.php
│   │   ├── ████████████████████████████████████.php
│   │   ├── █████████████
│   │   │   ├── █████████████████████████████.php
│   │   │   ├── ███████████████████████████.php
│   │   │   ├── █████████████████████████████.php
│   │   │   ├── ███████████████████████████████████████████.php
│   │   │   ├── ███████████████████████████████████████.php
│   │   │   ├── ████████████████████████████.php
│   │   │   └── █████████████████████████████.php
│   │   ├── ██████████████████████████████.php
│   │   └── █████████████████████████.php
│   ├── ███
│   │   ├── ████████████████████.php
│   │   ├── ██████████████████████.php
│   │   ├── █████████████████████.php
│   │   ├── █████████████.php
│   │   ├── █████████████████████.php
│   │   ├── ██████████████████.php
│   │   ├── ██████████████████.php
│   │   ├── ██████████████████████.php
│   │   ├── ██████████████████████.php
│   │   ├── ███████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ██████████████████.php
│   │   ├── ██████████████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ██████████████████.php
│   │   └── ████████████████.php
│   ├── ███████████████████.php
│   ├── █████████████████████.php
│   ├── ████████████
│   │   ├── ███████████████████████.php
│   │   ├── ██████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ████████████████████████
│   │   │   ├── █████████████████████████████████████████.php
│   │   │   ├── ██████████████████████████████████████.php
│   │   │   ├── █████████████████████████████████.php
│   │   │   ├── ██████████████████████████████.php
│   │   │   ├── ███████████████████████████████.php
│   │   │   ├── ███████████████████████████████████████.php
│   │   │   ├── ███████████████████████████████.php
│   │   │   ├── ████████████████████████████████████████.php
│   │   │   └── █████████████████████████████████████.php
│   │   ├── Invoices
│   │   │   ├── ████████████████████████████████████.php
│   │   │   ├── █████████████████████.php
│   │   │   ├── IgnoreMissedInvoicesController.php
│   │   │   ├── ██████████████████████.php
│   │   │   ├── ████████████████████.php
│   │   │   ├── InvoiceStatusController.php
│   │   │   ├── InvoicesController.php
│   │   │   ├── MissedInvoicesController.php
│   │   │   ├── ████████████████████████.php
│   │   │   └── RefreshMissedInvoicesController.php
│   │   ├── ████████
│   │   │   └── █████████████████████.php
│   │   ├── ██████████████████.php
│   │   └── ██████████████████.php
│   ├── ███████████████████
│   │   ├── ████████████████████████.php
│   │   ├── ████████████████████████████.php
│   │   ├── ███████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   ├── ███████████████████████████.php
│   │   ├── ██████████████████████████████████.php
│   │   ├── ███████████████████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   ├── ███████████████████████████████.php
│   │   ├── ████████████████████████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── █████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   ├── ██████████████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── ██████████████████████.php
│   │   ├── ████████████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── █████████████████████████████.php
│   │   ├── ██████████████████████.php
│   │   ├── ███████████████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── ███████████████████████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── ██████████████████████████████.php
│   │   ├── ███████████████████████████████.php
│   │   ├── █████████████████████████.php
│   │   ├── ██████████████████████.php
│   │   ├── ███████████████████████████.php
│   │   ├── █████████████████████████████████.php
│   │   ├── ███████████████████████████.php
│   │   ├── ████████████████████████████.php
│   │   ├── ████████████████████.php
│   │   └── ███████████████.php
│   ├── ███████████████.php
│   ├── ███████████████.php
│   ├── █████████████
│   │   ├── █████████████████████.php
│   │   ├── █████████████████████████████.php
│   │   ├── ████████████████████████████.php
│   │   ├── ███████████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   └── █████████████████████████.php
│   ├── ██████████████████.php
│   ├── █████████████████.php
│   ├── █████████████████████████.php
│   ├── ██████████████████████.php
│   ├── ████████
│   │   ├── ███████████████████.php
│   │   ├── ███████████████████████████.php
│   │   ├── █████████████████████.php
│   │   └── █████████████████.php
│   ├── ███████████████
│   │   ├── █████████████████.php
│   │   ├── ███████████████.php
│   │   ├── ██████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   ├── ██████████████████████████.php
│   │   └── ███████████████████.php
│   ├── ████████████████████.php
│   ├── ██████████
│   │   ├── ███████████████████████████.php
│   │   ├── ██████████████████.php
│   │   ├── ███████████████████.php
│   │   ├── ███████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── █████████████████████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── █████████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── ████████████████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── ███████████████████.php
│   │   ├── ███████████████████████.php
│   │   ├── ████████████████.php
│   │   ├── ██████████████████.php
│   │   ├── █████████████████.php
│   │   ├── ██████████████████.php
│   │   ├── █████████████████████████████.php
│   │   ├── ██████████████████████.php
│   │   ├── ████████████████████.php
│   │   ├── ████████████████████████.php
│   │   ├── ███████████████████.php
│   │   ├── ███████████████.php
│   │   └── ██████████████████.php
│   ├── ███████
│   │   └── ████████████████.php
│   └── ███████████████.php
├── Filters
│   ├── ████████████████████.php
│   ├── ███████████████████████████.php
│   ├── █████████████████████████.php
│   ├── ██████████████████████████████████.php
│   ├── ██████████████████████.php
│   ├── █████████████████████████████.php
│   ├── ██████████████████████████.php
│   ├── ████████████████.php
│   ├── ███████████.php
│   ├── ███████████.php
│   ├── ████████████████.php
│   ├── InvoiceMonthFilter.php
│   ├── InvoiceOfferFilter.php
│   ├── InvoiceStatusFilter.php
│   ├── InvoiceYearFilter.php
│   ├── █████████████████████.php
│   ├── ███████████.php
│   └── ███████████████████.php
├── Middleware
│   ├── ██████████████████████████.php
│   ├── █████████████████████.php
│   ├── █████████████████████████████████.php
│   ├── █████████████████████████████████████.php
│   ├── EnsureValidHabitantInvoiceCollectionSettingsMiddleware.php
│   ├── EnsureValidInvoiceDraftSettingsMiddleware.php
│   ├── ██████████████████████████████████.php
│   ├── EnsureValidOwnerInvoiceCollectionSettingsMiddleware.php
│   ├── ██████████████████████.php
│   ├── █████████████████████.php
│   ├── █████████████████████████████.php
│   ├── █████████████████████████████████.php
│   ├── ████████████████████.php
│   ├── ███████████████████.php
│   └── █████████████████.php
├── Queries
│   ├── ██████████████████.php
│   ├── ███████████████████████████.php
│   ├── ██████████████████.php
│   ├── ████████████████████████.php
│   ├── ██████████████████████.php
│   ├── ██████████████████.php
│   ├── ██████████████████████.php
│   ├── ███████████████████.php
│   ├── ████████████████████████.php
│   ├── █████████████████████████████.php
│   ├── ████████████████████████.php
│   ├── ████████████████████.php
│   ├── █████████████████████.php
│   ├── ███████████████████.php
│   ├── ████████████████████.php
│   ├── █████████████████████████.php
│   ├── ██████████████████████.php
│   ├── ███████████████████████.php
│   ├── ██████████████████.php
│   ├── ██████████████████████████████████.php
│   ├── ███████████████████████████.php
│   ├── █████████████████████.php
│   ├── InvoiceCollectionIndexQuery.php
│   ├── InvoiceIndexQuery.php
│   ├── █████████████████████████████.php
│   ├── ███████████████████████.php
│   ├── ███████████████.php
│   ├── ████████████████████████████.php
│   ├── ████████████████████████.php
│   ├── ██████████████████.php
│   ├── █████████████████████.php
│   ├── █████████████████████████████.php
│   ├── ████████████████████.php
│   ├── ████████████████.php
│   ├── ██████████████████.php
│   ├── █████████████████████████.php
│   ├── ████████████████████████.php
│   ├── █████████████████████.php
│   ├── ██████████████████.php
│   ├── ███████████████████.php
│   ├── ███████████████.php
│   └── ███████████████.php
├── Requests
│   ├── █████████████████████████.php
│   ├── █████████████████████.php
│   ├── ██████████████.php
│   ├── ██████████████.php
│   ├── ██████████████.php
│   ├── ████████████████.php
│   ├── ██████████████████████████████.php
│   ├── ███████████████████████.php
│   ├── ███████████████████████████████.php
│   ├── █████████████████████████████.php
│   ├── InvoiceRequest.php
│   ├── ██████████████████████.php
│   ├── ███████████████████.php
│   ├── █████████████████████.php
│   ├── ████████████.php
│   ├── ████████████████████.php
│   ├── ████████████████████████████████████.php
│   ├── ██████████████████████████████████.php
│   ├── ██████████████████.php
│   ├── ███████.php
│   ├── ██████████████████████.php
│   ├── ████████████.php
│   ├── ███████████.php
│   └── ████████████████████████.php
├── Resources
│   ├── ████████████████.php
│   ├── ███████████████.php
│   ├── ██████████████.php
│   ├── ███████████████████████.php
│   ├── █████████████████████████████.php
│   ├── ███████████████████████████.php
│   ├── ███████████████████.php
│   ├── ███████████████.php
│   ├── ████████████████████████████.php
│   ├── ██████████████████████.php
│   ├── ████████████████████████████████████.php
│   ├── ████████████████████.php
│   ├── █████████████████████████████████.php
│   ├── ███████████████.php
│   ├── █████████████████████████████.php
│   ├── ████████████████████.php
│   ├── ████████████████████.php
│   ├── █████████████████████████████████████.php
│   ├── ████████████████████████.php
│   ├── ████████████████.php
│   ├── ████████████████████.php
│   ├── █████████████████████████████████████.php
│   ├── ███████████████████████████████.php
│   ├── ███████████████████████████.php
│   ├── ████████████████████.php
│   ├── █████████████████████.php
│   ├── █████████████████████████.php
│   ├── █████████████████████.php
│   ├── █████████████████.php
│   ├── █████████████████████.php
│   ├── ██████████████████.php
│   ├── █████████████████████████.php
│   ├── █████████████████.php
│   ├── ████████████████.php
│   ├── ████████████████████.php
│   ├── ███████████████████████████████.php
│   ├── ████████████████████████████████.php
│   ├── ████████████████████████████████.php
│   ├── █████████████████████████████.php
│   ├── ███████████████████████████████.php
│   ├── ████████████████████████.php
│   ├── ████████████████████████████.php
│   ├── ████████████████.php
│   ├── █████████████████████.php
│   ├── ███████████████████████.php
│   ├── █████████████████.php
│   ├── Invoices
│   │   ├── InvoiceCollectionDataResource.php
│   │   ├── InvoiceCollectionResource.php
│   │   ├── InvoiceDataResource.php
│   │   ├── InvoiceDraftResource.php
│   │   ├── InvoiceLineDataResource.php
│   │   ├── InvoiceLineResource.php
│   │   ├── InvoiceResource.php
│   │   ├── ██████████████████.php
│   │   ├── █████████████████.php
│   │   └── █████████████.php
│   ├── InvoiceIndexResource.php
│   ├── InvoiceLabelResource.php
│   ├── InvoiceMainOverviewResource.php
│   ├── InvoiceeResource.php
│   ├── ████████████████████.php
│   ├── █████████████.php
│   ├── ███████████████.php
│   ├── ██████████████████████████.php
│   ├── ████████████████████.php
│   ├── ██████████████████.php
│   ├── ██████████████.php
│   ├── █████████████████████████████.php
│   ├── ██████████████████████████.php
│   ├── █████████████████████.php
│   ├── █████████████████████████.php
│   ├── █████████████.php
│   ├── ██████████████████████.php
│   ├── ███████████████████.php
│   ├── ███████████████.php
│   ├── ███████████████.php
│   ├── ███████████████.php
│   ├── █████████████████████.php
│   ├── █████████████.php
│   ├── █████████████████.php
│   ├── ███████████████████.php
│   ├── ███████████████████████.php
│   ├── ██████████████.php
│   ├── ██████████████████████████.php
│   ├── █████████████████.php
│   ├── ██████████████████████.php
│   ├── █████████████.php
│   ├── █████████████████.php
│   ├── ████████████.php
│   ├── ███████████████████████.php
│   ├── ████████████████.php
│   ├── ████████████████████.php
│   ├── ████████████████████████████.php
│   ├── █████████████████████.php
│   ├── ██████████████████████████.php
│   ├── █████████████████.php
│   ├── █████████████████████.php
│   ├── ███████████████████.php
│   ├── ████████████.php
│   ├── ████████████████.php
│   ├── ████████████.php
│   └── █████████████████████.php
└── ViewModels
    ├── █████████████████.php
    ├── ███████████████.php
    ├── ████████████████████████.php
    ├── █████████████████.php
    ├── ████████████████████.php
    ├── █████████████████████████████████.php
    ├── ████████████████████████████.php
    ├── ██████████████████████████.php
    ├── ██████████████████████████████.php
    ├── ████████████████████████.php
    ├── █████████████████.php
    ├── ██████████████████████████████.php
    ├── █████████████████████████.php
    ├── █████████████████████.php
    ├── █████████████.php
    ├── ████████████████.php
    ├── ██████████████████.php
    ├── █████████████████████.php
    ├── ██████████████████████.php
    ├── ██████████████████████████.php
    ├── ██████████████████████.php
    ├── ██████████████████.php
    ├── ████████████████████.php
    ├── ███████████████████.php
    ├── ██████████████████.php
    ├── █████████████████████████████.php
    ├── ██████████████████████████.php
    ├── █████████████████████.php
    ├── █████████████████.php
    ├── ██████████████████████████.php
    ├── ███████████████.php
    ├── ███████████████████████████.php
    ├── ████████████████████████
    │   ├── ████████████████.php
    │   ├── █████████████████.php
    │   ├── ██████████████████.php
    │   └── ███████████████████████.php
    ├── █████████████████████████.php
    ├── ███████████████████████████████.php
    ├── ███████████████████████████████.php
    ├── ███████████████████████.php
    ├── ██████████████████.php
    ├── InvoiceCollectionHabitantContractPreviewViewModel.php
    ├── InvoiceCollectionOwnerContractPreviewViewModel.php
    ├── InvoiceCollectionPreviewViewModel.php
    ├── InvoiceDraftViewModel.php
    ├── InvoiceIndexViewModel.php
    ├── InvoiceLabelsViewModel.php
    ├── InvoiceStatusViewModel.php
    ├── █████████████████.php
    ├── █████████████████████.php
    ├── ██████████████████████.php
    ├── █████████████.php
    ├── ██████████████████.php
    ├── ███████████████████.php
    ├── ██████████████.php
    ├── ██████████████████████.php
    ├── ████████████████████████████.php
    ├── ██████████████████████████████████████.php
    ├── ████████████████.php
    ├── █████████████████.php
    ├── ████████████████████████.php
    ├── ████████████████████████.php
    ├── █████████████████████.php
    ├── ██████████████████.php
    ├── ████████████████████.php
    ├── ██████████████████████████████.php
    ├── █████████████████████████.php
    ├── ███████████████████████████████.php
    ├── ██████████████████.php
    ├── ███████████████.php
    ├── ██████████████.php
    ├── ████████████████████.php
    ├── ████████████████████████.php
    ├── █████████████████.php
    ├── █████████████████████████.php
    ├── ██████████████████.php
    ├── ████████████████████████████.php
    ├── █████████████████████████████.php
    ├── █████████████████████.php
    ├── ██████████████████████.php
    ├── ██████████████████.php
    ├── ██████████████████████.php
    ├── █████████████████████████.php
    ├── ██████████████████████.php
    ├── █████████████████.php
    ├── █████████████.php
    ├── █████████████.php
    ├── ██████████████████████.php
    ├── █████████.php
    └── █████████████████.php

また会ったね!

スクロールするのはかなり大変でした。 冗談ではありませんが、これは私たちのプロジェクトの 1 つが 1 年半の開発を経て実際にどのようになったかを示しています。 そして、これが それだけ ドメインに関連するものは何も含まれていません。

では、ここでの中心的な問題は何ですか? 実際には、第 1 章のドメイン コードと同じです。実際の意味ではなく、技術的特性に基づいてコードをグループ化しています。 コントローラとコントローラ、リクエストとリクエスト、ビュー モデルとビュー モデルなど。

ここでも、請求書のような概念が複数のディレクトリに分散され、数十の他のクラスと混在しています。 最高の IDE サポートがあっても、アプリケーション全体を理解するのは非常に難しく、何が起こっているのか全体像を把握する方法がありません。

ソリューション? ここで驚くことはないと思います。 ドメインで行ったのと同じです: 一緒に属するコードをグループ化します。 この例では、請求書:

Admin
└── Invoices
    ├── Controllers
    │   ├── IgnoreMissedInvoicesController.php
    │   ├── InvoiceStatusController.php
    │   ├── InvoicesController.php
    │   ├── MissedInvoicesController.php
    │   └── RefreshMissedInvoicesController.php
    ├── Filters
    │   ├── InvoiceMonthFilter.php
    │   ├── InvoiceOfferFilter.php
    │   ├── InvoiceStatusFilter.php
    │   └── InvoiceYearFilter.php
    ├── Middleware
    │   ├── EnsureValidHabitantInvoiceCollectionSettingsMiddleware.php
    │   ├── EnsureValidInvoiceDraftSettingsMiddleware.php
    │   └── EnsureValidOwnerInvoiceCollectionSettingsMiddleware.php
    ├── Queries
    │   ├── InvoiceCollectionIndexQuery.php
    │   └── InvoiceIndexQuery.php
    ├── Requests
    │   └── InvoiceRequest.php
    ├── Resources
    │   ├── InvoiceCollectionDataResource.php
    │   ├── InvoiceCollectionResource.php
    │   ├── InvoiceDataResource.php
    │   ├── InvoiceDraftResource.php
    │   ├── InvoiceIndexResource.php
    │   ├── InvoiceLabelResource.php
    │   ├── InvoiceLineDataResource.php
    │   ├── InvoiceLineResource.php
    │   ├── InvoiceMainOverviewResource.php
    │   ├── InvoiceResource.php
    │   └── InvoiceeResource.php
    └── ViewModels
        ├── InvoiceCollectionHabitantContractPreviewViewModel.php
        ├── InvoiceCollectionOwnerContractPreviewViewModel.php
        ├── InvoiceCollectionPreviewViewModel.php
        ├── InvoiceDraftViewModel.php
        ├── InvoiceIndexViewModel.php
        ├── InvoiceLabelsViewModel.php
        └── InvoiceStatusViewModel.php

どのようにそのことについて? 請求書を処理しているときに、利用できるコードを 1 か所で確認できます。 私はこれらのグループを「アプリケーション モジュール」または略して「モジュール」と呼ぶ傾向があります。 経験上、この規模のプロジェクトで作業しているときは、作業がずっと楽になると言えます。

これは、ドメイン上でモジュールを 1 対 1 でマッピングする必要があるということですか? 絶対にありません! 多少重複する可能性がありますが、必須ではありません。 たとえば、管理アプリケーション内に設定モジュールがあり、一度に複数のドメイン グループにアクセスできます。 個別の設定コントローラーやビュー モデルなどを複数のモジュールに分散させるのは意味がありません。 ドメインと同期するためだけに複数のモジュールに分散するものではありません。

この構造を見て発生する可能性のある別の問題は、汎用クラスをどうするかということです。 ベース リクエスト クラス、あらゆる場所で使用されるミドルウェアのようなもの… Support 名前空間は第 1 章に戻りましたか? それがそのためです! Support グローバルにアクセスできる必要があるすべてのコードを保持しますが、フレームワークの一部であってもかまいません。

アプリケーションを構築する方法の概要を説明したので、次は、作業を簡単にするために使用するパターンのいくつかを見てみましょう。 次回は、ビュー モデルについて説明します。

次の投稿
テキサスの10の在来植物
前の投稿
オーバーウォッチ 2 ウィンター ワンダーランド 2022 の概要 – すべてのスキン、Twitch Drops、およびアーケード モード

ノート:

AZ: 動物の世界、ペット、ペット、野生の自然に関するカテゴリー記事…
SP:スポーツカテゴリー。
New vs Ne: ニュースコラム。
Te: テクノロジー カテゴリ。
Gt:エンターテインメントカテゴリー。
Bt: 占い、星占い、超常現象、超常現象。
Ta:人生コラム。