从业务层

时间:2017-02-19 05:45:51

标签: laravel validation n-tier-architecture laravel-5.4

构建控制器时,验证规则是否来自注入的存储库是不好的做法?例如,请考虑以下界面:

interface UserRepository
{
  /**
   * @return array
   */
  public function getCreateRules();
}

然后可以在控制器的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中等帖子,所以我想知道这是否是适合其年龄的有效资源。

1 个答案:

答案 0 :(得分:2)

我个人不会为此使用存储库而是使用FormRequest

https://laravel.com/docs/5.4/validation#form-request-validation

这样:

  1. 您的代码仍可重复使用
  2. 您不必创建任何添加逻辑,因为它全部内置
  3. 您可以使用类型提示来解析容器外的类,而容器将自动处理该方法的验证。
  4. 此外,如果您需要创建和更新规则不同,则可以使用简单的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
        ...
    }
    

    希望这有帮助!