从业务层检索控制器的验证规则
Validation rules for controller retrieved from business layer
在构建控制器时,让验证规则来自注入的存储库是一种不好的做法吗?例如,考虑以下接口:
interface UserRepository
{
/**
* @return array
*/
public function getCreateRules();
}
那么这个函数的用法可以在controller的store
方法中找到:
class UserController extends Controller
{
private $repo;
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
public function store(Request $request)
{
$this->validate($request, $this->repo->getCreateRules());
...
}
}
我的问题是,如果将规则移动到业务层,它是否正在混合关注点。这个想法来自 2014 年的 this Medium post,所以我想知道考虑到它的年龄,这是否是一个有效的资源。
我个人不会为此使用存储库,而是使用 FormRequest
。
https://laravel.com/docs/5.4/validation#form-request-validation
这样:
- 您的代码仍然可以重复使用
- 您不必创建任何加法逻辑,因为它就是全部 built-in
- 您可以使用类型提示将 class 解析出容器,容器又会 运行 自动处理方法验证。
此外,如果您需要不同的规则来创建和更新,您可以使用简单的 switch 语句,例如
public function rules()
{
switch ($this->method()) {
case 'GET':
return [
//Create rules
];
case 'PUT':
case 'PATCH':
return [
//Update rules
];
}
}
您的 store
方法将类似于:
public function store(UserRequest $request)
{
//Validation will have already been handled by this point so you
//don't need to add it manually
...
}
希望对您有所帮助!
在构建控制器时,让验证规则来自注入的存储库是一种不好的做法吗?例如,考虑以下接口:
interface UserRepository
{
/**
* @return array
*/
public function getCreateRules();
}
那么这个函数的用法可以在controller的store
方法中找到:
class UserController extends Controller
{
private $repo;
public function __construct(UserRepository $repo)
{
$this->repo = $repo;
}
public function store(Request $request)
{
$this->validate($request, $this->repo->getCreateRules());
...
}
}
我的问题是,如果将规则移动到业务层,它是否正在混合关注点。这个想法来自 2014 年的 this Medium post,所以我想知道考虑到它的年龄,这是否是一个有效的资源。
我个人不会为此使用存储库,而是使用 FormRequest
。
https://laravel.com/docs/5.4/validation#form-request-validation
这样:
- 您的代码仍然可以重复使用
- 您不必创建任何加法逻辑,因为它就是全部 built-in
- 您可以使用类型提示将 class 解析出容器,容器又会 运行 自动处理方法验证。
此外,如果您需要不同的规则来创建和更新,您可以使用简单的 switch 语句,例如
public function rules()
{
switch ($this->method()) {
case 'GET':
return [
//Create rules
];
case 'PUT':
case 'PATCH':
return [
//Update rules
];
}
}
您的 store
方法将类似于:
public function store(UserRequest $request)
{
//Validation will have already been handled by this point so you
//don't need to add it manually
...
}
希望对您有所帮助!