您是否曾經製作過一個控制器,您必須做大量工作來準備要傳遞給視圖的變數?您可以將此類工作轉移到所謂的視圖模型。本質上,視圖模型是簡單的類,它會獲取一些數據,並將其轉換為可用於視圖的內容。
您可以在 Stitcher.io 上的這篇文章中找到更詳細的解釋和一些很好的範例。
Laravel 的本機視圖編輯器與此套件提供的視圖模型不同。要了解有關差異的更多信息,請參閱 Stitcher.io 上的這篇博文。
我們投入了大量資源來創建一流的開源套件。您可以透過購買我們的一款付費產品來支持我們。
我們非常感謝您從家鄉寄給我們一張明信片,並註明您正在使用我們的哪種套餐。您可以在我們的聯絡頁面上找到我們的地址。我們在虛擬明信片牆上發布所有收到的明信片。
您可以透過 Composer 安裝該軟體包:
composer require spatie/laravel-view-models
視圖模型是一個類,您可以在其中為視圖放置一些複雜的邏輯。這將使您的控制器變得更輕。您可以透過擴充提供的SpatieViewModelsViewModel
來建立視圖模型。
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 >
視圖模型中的所有公共方法和屬性都會自動公開給視圖。如果您不希望某個特定方法在您的視圖中可用,則可以忽略它。
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
中。
請參閱變更日誌以了解有關最近更改內容的更多資訊。
詳細資訊請參閱貢獻。
如果您發現有關安全的錯誤,請發送郵件至 [email protected],而不是使用問題追蹤器。
麻省理工學院許可證 (MIT)。請參閱許可證文件以獲取更多資訊。