从业务层检索控制器的验证规则

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

这样:

  1. 您的代码仍然可以重复使用
  2. 您不必创建任何加法逻辑,因为它就是全部 built-in
  3. 您可以使用类型提示将 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
    ...
}

希望对您有所帮助!