您是否曾经制作过一个控制器,您必须做大量工作来准备要传递给视图的变量?您可以将此类工作转移到所谓的视图模型中。本质上,视图模型是简单的类,它获取一些数据,并将其转换为可用于视图的内容。
您可以在 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)。请参阅许可证文件以获取更多信息。