ビューに渡す変数を準備するために多くの作業を行う必要があるコントローラーを作成したことがありますか?この種の作業は、いわゆるビューモデルに移動できます。本質的に、ビュー モデルは、データを受け取り、それをビューで使用できるものに変換する単純なクラスです。
Stitcher.io のこのブログ投稿には、より詳細な説明といくつかの良い例が記載されています。
Laravel のネイティブ ビュー コンポーザーは、このパッケージで提供されるビュー モデルと同じではありません。違いについて詳しくは、Stitcher.io のこのブログ投稿を参照してください。
私たちはクラス最高のオープンソース パッケージの作成に多くのリソースを投資しています。有料製品のいずれかを購入することで、私たちをサポートできます。
当社のどのパッケージを使用しているかについて、故郷から葉書を送っていただき、誠にありがとうございます。当社の住所は、お問い合わせページに記載されています。受け取ったすべてのポストカードをバーチャル ポストカード ウォールに公開します。
パッケージは、composer 経由でインストールできます。
composer require spatie/laravel-view-models
ビュー モデルは、ビューに複雑なロジックを追加できるクラスです。これにより、コントローラーが少し軽くなります。提供されているSpatieViewModelsViewModel
拡張することで View Model を作成できます。
class PostViewModel extends ViewModel
{
public $ user ;
public $ post ;
public $ indexUrl = null ;
public function __construct ( User $ user , Post $ post = null )
{
$ this -> user = $ user ;
$ this -> post = $ post ;
$ this -> indexUrl = action ([PostsController::class, ' index ' ]);
}
public function post (): Post
{
return $ this -> post ?? new Post ();
}
public function categories (): Collection
{
return Category:: canBeUsedBy ( $ this -> user )-> get ();
}
}
次に、次のようにコントローラーでビュー モデル クラスを使用できます。
class PostsController
{
public function create ()
{
$ viewModel = new PostViewModel (
current_user ()
);
return view ( ' blog.form ' , $ viewModel );
}
public function edit ( Post $ post )
{
$ viewModel = new PostViewModel (
current_user (),
$ post
);
return view ( ' blog.form ' , $ viewModel );
}
}
ビューでは次のことができます。
< input type = " text " value = " {{ $post -> title } } " />
< input type = " text " value = " {{ $post -> body } } " />
< select >
@foreach ( $categories as $category )
< option value = " {{ $category -> id } } " > {{ $category -> name } } </ option >
@endforeach
</ select >
< a href = " {{ $indexUrl } } " >Back</ a >
View Model 内のすべてのパブリック メソッドとプロパティは、自動的にビューに公開されます。特定のメソッドをビューで使用できるようにしたくない場合は、それを無視できます。
class PostViewModel extends ViewModel
{
protected $ ignore = [ ' ignoredMethod ' ];
/ / …
public function ignoredMethod () { / * … * / }
}
PHP に組み込まれているすべてのマジック メソッドは自動的に無視されます。
コントローラーからビューモデルを直接返すことができます。デフォルトでは、データを含む JSON 応答が返されます。
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return new PostViewModel ( $ post );
}
}
このアプローチは、AJAX で送信されたフォームを操作する場合に役立ちます。
ビューを直接返すこともできます。
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return ( new PostViewModel ( $ post ))-> view ( ' post.form ' );
}
}
リクエストのContent-Type
ヘッダーが JSON に設定されている場合、このアプローチではレンダリングされたビューの代わりに JSON データも返されることに注意してください。
ビュー モデルは、追加のパラメーターを必要とする関数を公開できます。
class PostViewModel extends ViewModel
{
public function formatDate ( Carbon $ date ): string
{
return $ date -> format ( ' Y-m-d ' );
}
}
これらの関数はビュー内で次のように使用できます。
{{ $ formatDate ( $post -> created_at ) } }
パッケージには、新しいビュー モデルを作成するための Artisan コマンドが含まれていました。
php artisan make:view-model HomepageViewModel
このビュー モデルにはAppViewModels
名前空間があり、 app/ViewModels
に保存されます。
またはカスタム名前空間 ( AppBlog
など)
php artisan make:view-model " Blog/PostsViewModel "
このビュー モデルにはAppBlogViewModels
名前空間があり、 app/Blog/ViewModels
に保存されます。
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
セキュリティに関するバグを見つけた場合は、問題トラッカーを使用する代わりに [email protected] にメールを送信してください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。