maduser / laravel-viewmodel
Laravel 的 ViewModel
1.0.4
2022-01-12 18:54 UTC
Requires
- php: >=7.1.3
- maduser/laravel-support: *
Requires (Dev)
- phpunit/phpunit: ^7.0
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]) ]);