spatie / laravel-view-models
Laravel中的视图模型
Requires
- php: ^7.3|^8.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^6.23|^7.0|^8.0|^9.0
- pestphp/pest: ^1.22|^2.34
README
你有没有做过控制器,其中需要做大量工作来准备要传递给视图的变量?你可以将这种工作移动到所谓的视图模型。本质上,视图模型是简单的类,它接收一些数据,并将其转换成视图可用的形式。
你可以在Stitcher.io上的这篇博客文章中找到更详细的解释和一些好的示例:这里。
此包提供的视图模型与Laravel本地的视图组合器不同。要了解更多关于它们之间的区别,请访问Stitcher.io上的这篇博客文章:这里。
支持我们
我们投入了大量资源来创建一流的开放源代码包。你可以通过购买我们的付费产品之一来支持我们。
我们非常感谢你从你的家乡给我们寄来明信片,说明你正在使用我们的哪些包。你可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上。
安装
您可以通过composer安装此包
composer require spatie/laravel-view-models
用法
视图模型是一个类,您可以在其中放置一些用于视图的复杂逻辑。这将使您的控制器更轻量。您可以通过扩展提供的Spatie\ViewModels\ViewModel
来创建视图模型。
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
此视图模型将具有App\ViewModels
命名空间,并保存在app/ViewModels
中。
或者到自定义命名空间,例如App\Blog
php artisan make:view-model "Blog/PostsViewModel"
此视图模型将具有App\Blog\ViewModels
命名空间,并保存在app/Blog/ViewModels
中。
更新日志
请参阅更新日志以获取有关最近更改的更多信息。
贡献
请参阅CONTRIBUTING以获取详细信息。
安全
如果您发现有关安全性的错误,请发送邮件至security@spatie.be,而不是使用问题跟踪器。
致谢
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。