我创建了一个名为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()
方法中包含的代码。
答案 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');
}