(jp) =
先月、Laravel のビュー モデルについて書きました。 投稿に対して多くの良い反応を受け取りましたが、同じ質問が何度も繰り返されました: ビュー モデルは Laravel のビュー コンポーザーとどう違うのですか?
この質問をきっぱりと明確にする時が来ました。
# 作曲家を見る
Laravel でビュー コンポーザーがどのように使用されているかを見てみましょう。 ビュー コンポーザーは、グローバル構成からビューにデータをバインドする方法です。
Laravel のドキュメントでは、次のように説明されています。
ビュー コンポーザーは、ビューがレンダリングされるときに呼び出されるコールバックまたはクラス メソッドです。 ビューがレンダリングされるたびにそのビューにバインドしたいデータがある場合、ビュー コンポーザーはそのロジックを 1 つの場所に整理するのに役立ちます。
ビュー コンポーザーはこのように登録されます。例は Laravel ドキュメントから取得されます。
class ComposerServiceProvider extends ServiceProvider
public function boot()
View::composer(
'profile', ProfileComposer::class
);
View::composer('dashboard', function ($view)
);
ご覧のとおり、ビューに変数を追加するために使用できるクラスとクロージャーの両方を使用できます。
コントローラーでビュー コンポーザーを使用する方法を次に示します。
class ProfileController
public function index()
return new view('profile');
見えますか? いいえ、もちろんそうではありません。ビュー コンポーザはグローバル状態のどこかに登録されており、その暗黙の知識がなければ、ビューでどの変数を使用できるかわかりません。
今私は 知る これは小さなプロジェクトでは問題になりません。 あなたが 1 人の開発者で、20 個のコントローラーとおそらく 20 個のビュー コンポーザーしか持っていない場合、すべてが頭の中に収まります。
しかし、開発者が 3 人か 4 人で、数百のコントローラーがあるプロジェクトの場合はどうでしょうか? この暗黙の知識を持たないレガシー プロジェクトを引き継ぐ場合はどうなるでしょうか。
これが、Spatie が大規模なプロジェクトでビュー モデルを使用する理由です。 それらはすべてをより明確にし、コードを保守可能に保つのに役立ちます。
私たちがしていることは次のとおりです。
class ProfileController
public function index(User $user)
return new view(
'profile',
new ProfileViewModel($user)
);
これで、コントローラー自体から、ビューで使用できる変数が明確になりました。 複数のコンテキストで同じビューを再利用することもできます。 例として、作成アクションと編集アクションで使用される同じフォーム ビューがあります。
最後に追加されたもう 1 つの利点は、考えもしなかったかもしれませんが、データをビュー モデルに明示的に渡すことができることです。 ビューに渡されるデータを決定するためにルート引数またはバインドされたモデルを使用する場合は、明示的に行われます。
結論として、グローバルな状態を管理することは、特に同じプロジェクトで複数の開発者と作業している場合、大規模なアプリケーションでは苦痛です。 また、2 つの手段の最終結果が同じだからといって、それらが同じであるとは限らないことも覚えておいてください。
この簡単な記事が、ビュー モデルとコンポーザーの違いに関するすべての質問に答えてくれることを願っています。 特にビュー モデルについて詳しく知りたい場合は、こちらのブログ投稿を必ずお読みください。