在Laravel 5.1中使用CustomRequest进行表单验证失败了?

时间:2015-12-30 05:16:45

标签: php laravel-5.1

我创建了一个名为Request的自定义CustomerRequest,我想用它来创建新客户时验证表单字段。我无法让它工作,它似乎继续进入store()方法,即使它应该失败。

我有三个必填字段:givenname,surname,email

这是我的CustomerRequest

public function rules()
{
    return [
        'givenname' => 'required|max:3',
        'surname' => 'required',
        'email' => 'required|unique:customers,email',
    ];
}

这是我的CustomerController

use pams\Http\Requests\CustomerRequest;

-----------------------------------------

public function store(CustomerRequest $request, Customer $customer)
{
    $request['created_by'] = Auth::user()->id;
    $request['modified_by'] = Auth::user()->id;

    $customer->create($request->all());

    return redirect('customers');
}

当我使用givenname" Vince"提交表单时它应该失败,因为它长度超过3个字符,但我得到了这个错误:

FatalErrorException in CustomerController.php line 52: Cannot use object of type pams\Http\Requests\CustomerRequest as array

控制器中的第52行是$request['created_by'] = Auth::user()->id;

根据我的理解,如果CustomerRequest失败,则应将用户重定向回customers.create页面,而不是运行store()方法中包含的代码。

3 个答案:

答案 0 :(得分:0)

我发现了问题。

CustomerRequest

use Request;

而不是:

use pams\Http\Requests\Request;

现在验证通过并按预期失败。

答案 1 :(得分:0)

来自docs表单请求验证

  

您需要做的就是在控制器方法上键入提示请求。   在控制器方法之前验证传入的表单请求   叫,这意味着你不需要用你的控制器混乱   验证逻辑

解决方案就是这样使用它:

CustomerController.php

use Illuminate\Http\Request;
// ...
public function store(CustomerRequest $customerRequest, Customer $customer,Request $request)
{
    $request['created_by'] = Auth::user()->id;
    $request['modified_by'] = Auth::user()->id;

    $customer->create($request->all());

    return redirect('customers');
}

所以你想知道的是,你在自定义请求验证器CustomerRequest.php中扩展的FormRequest - 与位于request命名空间中的Illuminate\Http略有不同。 实际上,如果您运行(使用旧代码)dd($request['created_by'] = Auth::user()->id);,您可能会发现原因。你应该得到禁止这个词!一个例外,告诉它“不可实例化”。 (在我的情况下,我被禁止,因为我现在已经在5.2上测试了它。)

答案 2 :(得分:0)

$ request是对象,请按照以下方式使用

use pams\Http\Requests\CustomerRequest;

-----------------------------------------

public function store(CustomerRequest $request, Customer $customer)
{
    $inputs = $request->all();
    $inputs['created_by'] = Auth::user()->id;
    $inputs['modified_by'] = Auth::user()->id;

    $customer->create($inputs);

    return redirect('customers');
}