laravel-commode / viewmodel
laravel 5. 的 ViewModel 方法(=>1)
Requires
- php: >=5.5.0
- illuminate/http: 5.1.*
- illuminate/support: 5.1.*
- laravel-commode/silent-service: dev-master
- laravel-commode/validation-locator: dev-master
Requires (Dev)
- satooshi/php-coveralls: dev-master
This package is not auto-updated.
Last update: 2024-09-14 15:58:08 UTC
README
#Commode: ViewModel
laravel-commode/viewmodel 是 laravel 框架中 ViewModel 方法的实现。
####内容
##安装
您可以使用 composer 安装 laravel-commode/viewmodel。
"require": {
"laravel-commode/viewmodel": "dev-master"
}
要启用包,您需要在应用程序配置中注册 LaravelCommode\ViewModel\ViewModelServiceProvider
服务提供者。
<?php
// ./yourLaravelApplication/app/config/app.php
return [
// ... config code
'providers' => [
// ... providers
'LaravelCommode\ViewModel\ViewModelServiceProvider'
]
];
##我为什么要费心?我可以打赌,许多 laravel 用户会问这个问题
"为什么我要关心 ViewModel 方法,既然我已经有
Eloquent
模型和Input
面具?".
同样,我也打赌这类用户从未使用过仓库/服务/策略模式方法。首先,我想说,Eloquent 不是一个模型。它是以 ActiveRecord 模式实现与数据库通信的绝佳方式。但是,仍然存在每个 eloquent 用户都必须面对的问题,比如封装在 $attributes
数组中的属性。另外,将应用程序输入数据聚合到 ActiveRecord 模型中真的很糟糕,因为当应用程序越来越大时,ActiveRecord 模式中的数据聚合会带来很多痛苦,尤其是如果没有进行抽象,它变得难以阅读、测试和上下文可靠。想象一下,如果你决定转向 Doctrine
的使用,那么重构所有数据聚合/提取/存储将会多么头疼。
因此,结论是,我可以这样说,ViewModel 在用户与数据库交互之间带来了另一个抽象层。
此包提供了两种基本的 ViewModel 类型:用于仅与文件一起使用的 FileViewModel
,以及用于与文件和常见值一起使用的 ViewModel
。
假设您必须为 Profile 模型实现面向上下文的模型,因为它是面向上下文模型的典型示例:它在您 acl 中使用,在您的管理面板中使用,由您的用户使用,等等... 并且几乎每次它都需要不同的验证器、在存储或拒绝存储在您的数据库之前的不同数据聚合过程等。要创建您的 ViewModel,您需要扩展 LaravelCommode\ViewModel\ViewModels\ViewModel
并实现两个受保护的方法
getBaseModel($attributes = array())
- 将接收一个属性关联数组 - ViewModel 的公共属性的当前值。方法必须返回 ViewModel 可以转换到的模型。这可以非常有用,用于转换到其他对象。
getValidationObject($data = [], $isNew = true)
- 将接收一个属性关联数组 - ViewModel 的公共属性的当前值和一个布尔标志,指示模型是正在创建还是更新。方法必须返回 Laravel 验证器实例。
例如
<?php namespace MyApp\Domain\Admin\ViewModels;
use LaravelCommode\ViewModel\ViewModels\ViewModel;
class Profile extends ViewModel
{
public $login;
public $password;
public $password_confirmation;
public $email;
public $firstname;
public $lastname;
protected function getBaseModel($attributes = array())
{
$model = new \MyApp\DAL\Eloquent\Models\Profile();
$model->fill($attributes);
return $model;
}
protected function getValidationObject($data = [], $isNew = true)
{
$rules = [
'login' => 'required',
'email' => 'required',
'firstname' => 'required',
'lastname' => 'required'
];
if ($isNew)
{
$rules['password'] = 'required|confirmed';
}
return \Validator::make($data, $rules);
}
}