Laravel:表单验证未按预期工作

时间:2015-04-27 13:56:23

标签: php laravel

当我尝试使用表单验证来验证来自客户端的数据时,我无法正确验证它,因为即使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参数丢失。

我该怎么处理这件事?我想首先查看规则然后如果可以继续授权。

3 个答案:

答案 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;
}