maduser/laravel-viewmodel

Laravel 的 ViewModel

安装: 3

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:项目

1.0.4 2022-01-12 18:54 UTC

This package is auto-updated.

Last update: 2024-08-30 19:39:57 UTC


README

很久以前,在一个遥远的星系中... Laravel 没有视图组件。这就是这个解决方案的年龄。虽然不再是最新的 Laravel 方法,但仍是一个有效的方法。

maduser/laravel-viewmodel 包提供了一个优雅的方式来封装 Laravel 应用中视图所需的数据和逻辑,促进关注点分离和可重用代码。通过使用 ViewModel,您可以简化控制器和视图,使代码库更易于维护和理解。

功能

  • 灵活的响应: ViewModel 可以根据请求自动确定是渲染视图还是返回 JSON,为 API 和 Web 界面提供灵活性。
  • 逻辑封装: 通过将展示逻辑移动到 ViewModel,保持控制器整洁。
  • 易于使用: 通过最小设置实现 ViewModel,并与 Laravel 的响应处理无缝结合使用。

安装

使用 composer 安装此包

composer require maduser/laravel-viewmodel

快速入门

创建 ViewModel

ViewModel 定义简单。以下是一个显示引用的 ViewModel 示例

use Maduser\Laravel\ViewModel\ViewModel;

class MyQuoteWidget extends ViewModel
{
    protected $view = 'my-widget'; // Blade template
    protected $quote; // Quote string

    public function getQuote(): ?string
    {
        return $this->quote;
    }

    public function setQuote(?string $quote): MyQuoteWidget
    {
        $this->quote = $quote;
        return $this;
    }
}

Blade 模板

为您的 ViewModel 创建相应的 Blade 模板。对于 MyQuoteWidget ViewModel,my-widget.blade.php 文件可能如下所示

<div class="widget quote">
    <p>{{ $view->getQuote() }}</p>
</div>

在控制器中使用 ViewModel

您可以在控制器中使用 ViewModel 将数据传递给视图。以下是如何使用 Page ViewModel 的示例

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Maduser\Laravel\ViewModel\ViewModels\Page;

class ExampleController extends Controller
{
    private $exampleVars;

    public function __construct()
    {
        $this->exampleVars = [
            'title' => 'Welcome Home',
            'text' => 'An inspiring quote here'
        ];
    }

    public function showPage(): Responsable
    {
        // Creating and returning a ViewModel instance
        return Page::create($this->exampleVars);
    }
}

高级用法

Responsable 接口

ViewModel 实现了 Laravel 的 Responsable 接口,允许它们直接从控制器方法返回。根据请求的 可接受的内容类型,响应可以是渲染的视图或 JSON 表示。

要强制响应类型,可以使用 render() 或 toJson() 等方法。要添加更多可接受的内容类型(例如 pdf),请结合使用 ViewModel::macro()、Laravel Request::macro() 和 Response::macro()。

有用的方法

  • __toString(): 当 ViewModel 作为字符串处理时,自动渲染视图。
  • toArray(): 返回 ViewModel 的数组表示形式,用于格式化 JSON 响应的结构。
  • toJson(): 返回 ViewModel 的 JSON 字符串表示形式。

嵌套 ViewModel

这完全可行...

$userWidget = UserWidget::create([
    'profile' => UserProfile::create(),
    'activity' => UserActivity::create(['activities' => $user->activities])
]);