spatie/laravel-view-models

Laravel中的视图模型

1.6.0 2024-03-13 17:58 UTC

This package is auto-updated.

Last update: 2024-09-13 19:14:11 UTC


README

Latest Version on Packagist GitHub Workflow Status Total Downloads

你有没有做过控制器,其中需要做大量工作来准备要传递给视图的变量?你可以将这种工作移动到所谓的视图模型。本质上,视图模型是简单的类,它接收一些数据,并将其转换成视图可用的形式。

你可以在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)。请参阅许可证文件以获取更多信息。