如何在Laravel中合并两个请求


How to merge two Request in Laravel

在我的Laravel(5.1)项目中,我需要创建一个用于验证表单的请求。

但对于这个请求,我想合并两个不同的请求:

第一个请求:

class AdvertisementRequest extends Request {
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            'ads_type' => 'required|numeric|in:0,1',
            'category' => 'required|numeric|exists:categories,id',
            'title' => 'required|alpha_num|max:45',
            'description' => 'required|alpha_num|max:2000',
            'price' => 'required|numeric',
        ];
    }
}

第二个请求:

class UserRegisterRequest extends Request {
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        $rules = [
            'form_type' => 'required|numeric|in:0,1',
            'user_type' => 'required|numeric|in:0,1',
            'phone' => 'required|phone_number',
            'region' => 'required|numeric|exists:regions,id',
            'department' => 'required|numeric|exists:departments,code',
            'postal_code' => 'required|postal_code',
            'city' => 'alpha|max:45',
            'id_city' => 'required|numeric|exists:cities,id',
            'last_name' => 'required|alpha_sp|max:45',
            'first_name' => 'required|alpha_sp|max:45',
            'pseudo' => 'required|alpha|max:45|unique:users',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|alpha_num|min:6|max:45',
        ];
        return $rules;
    }
}

我想创建第三个请求,将另外两个请求组合起来:

class UserAdvertisementRegisterRequest extends Request {
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        $rules = [
            'ads_type' => 'required|numeric|in:0,1',
            'category' => 'required|numeric|exists:categories,id',
            'title' => 'required|alpha_num|max:45',
            'description' => 'required|alpha_num|max:2000',
            'price' => 'required|numeric',
            'form_type' => 'required|numeric|in:0,1',
            'user_type' => 'required|numeric|in:0,1',
            'phone' => 'required|phone_number',
            'region' => 'required|numeric|exists:regions,id',
            'department' => 'required|numeric|exists:departments,code',
            'postal_code' => 'required|postal_code',
            'city' => 'alpha|max:45',
            'id_city' => 'required|numeric|exists:cities,id',
            'last_name' => 'required|alpha_sp|max:45',
            'first_name' => 'required|alpha_sp|max:45',
            'pseudo' => 'required|alpha|max:45|unique:users',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|alpha_num|min:6|max:45',
        ];
        return $rules;
    }
}

有什么解决方案可以在不重复我的代码的情况下做到这一点吗?

抱歉我英语不好:/。

提前感谢您的回复!

最简单的方法是以以下方式在UserAdvertisementRegisterRequest::rules方法中生成验证规则的合并列表:

class UserAdvertisementRegisterRequest extends Request { 
  public function rules()
  {
    return array_merge(
      with(new AdvertisementRequest)->rules(), 
      with(new UserRegisterRequest)->rules()
    );
  }
}

我试图通过扩展另一个请求并尝试将规则与父/子请求之间的逻辑相结合来明智地处理合并。我对GET和POST也有不同的规则/格式,所以我的父请求类有一个函数,可以根据它向我提供数据,这是我的一个transformer所期望的。

但最终最好保持解耦,我发现可以将多个请求对象注入控制器。每个请求都包含相同的值,但每个请求都会根据自己的规则验证请求。对于我的transformer,我只传递transformer期望的请求版本,这样它就可以调用扩展的get函数并从那里进行转换。

public function store(
    StoreEventRequest          $storeEventRequest, 
    UserListRequest            $userListRequest, 
    UserListRequestTransformer $transformer
) {
    $eventDetails     = $storeEventRequest->all();
    $userListIterator = $transformer->requestToUserList($userListRequest);
    ...
}