当我尝试使用表单验证来验证来自客户端的数据时,我无法正确验证它,因为即使authorize()
中包含的验证规则被违反,也会执行rules()
方法。
这是代码:
class PostAssignRequest extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
$params = $this->request->all();
if(User::find($params['userId'])->company != Auth::user()->company)
{
return false;
}
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = [
'userId' => 'required|exists:users,id',
'taskId' => 'required|exists:tasks,id'
];
return $rules;
}
}
在此示例中,即使未设置User::find()
参数,也会执行userId
。
我还注意到,如果authorize()
方法只返回true
,那么我会收到422
响应,告诉我userId
参数丢失。
我该怎么处理这件事?我想首先查看规则然后如果可以继续授权。
答案 0 :(得分:3)
授权和验证在ValidatesWhenResolvedTrait@validate
中调用:
public function validate()
{
$instance = $this->getValidatorInstance();
if ( ! $this->passesAuthorization())
{
$this->failedAuthorization();
}
elseif ( ! $instance->passes())
{
$this->failedValidation($instance);
}
}
您可以通过覆盖表单请求中的validate
方法来更改顺序。如果您对所有请求都要这样,请在基类App\Http\Requests\Request
中执行此操作:
public function validate()
{
$instance = $this->getValidatorInstance();
if ( ! $instance->passes())
{
$this->failedValidation($instance);
}
elseif ( ! $this->passesAuthorization())
{
$this->failedAuthorization();
}
}
答案 1 :(得分:1)
当Laravel首先执行authorize()时,你需要在那里进行手动检查。我想这不是以你的方式使用它。
如果您收到422响应,那么您正在执行Ajax请求。您可以使用响应422来处理客户端代码中的表单验证错误。
答案 2 :(得分:0)
我建议您更愿意使用中间件进行检查。中间件更符合您的目的。以下代码应移至中间件。
if(User::find($params['userId'])->company != Auth::user()->company)
{
return false;
}