使用 laravel 请求类时,在数组错误上调用成员函数失败()

Posted

技术标签:

【中文标题】使用 laravel 请求类时,在数组错误上调用成员函数失败()【英文标题】:Call to a member function fails() on array error when using laravel Request classses 【发布时间】:2020-06-10 00:43:43 【问题描述】:

我正在使用自定义请求类进行 laravel 表单验证。

这是我的请求类

class ContactUsRequest extends FormRequest

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    
        return [
            'lname' => 'required'
        ];
    

   /**
   * Get the error messages for the defined validation rules.
   *
   * @return array
   */
    public function messages()
    
        return [
            'lname.required' => 'please enter the last name'
        ];
    

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    
        return true;
    

这就是我所说的,

public function send(ContactUsRequest $request) 
        $validator = $request->validated();

        if ($validator->fails()) 
            return redirect('/contactus')
                            ->withErrors($validator)
                            ->withInput();
         else 
            ContactUs::create($request->all());

            return redirect('/contactus');
        
    

但是当我输入正确的值时,我得到了这个,

Symfony\Component\Debug\Exception\FatalThrowableError (E_ERROR) 在数组上调用成员函数失败()

【问题讨论】:

【参考方案1】:

使用表单请求类

如果验证失败,将自动生成重定向响应,将用户送回之前的位置。错误也将闪现到会话中,以便显示。如果请求是 AJAX 请求,将向用户返回带有 422 状态代码的 HTTP 响应,其中包括验证错误的 JSON 表示。

为了捕获验证失败,您可以使用 Validator 外观

例如

use Illuminate\Support\Facades\Validator;
//...

public function send(Request $request) 
        $validator = Validator::make($request->all(), [
            'lname' => 'required'
            // ...
        ]);

        if ($validator->fails()) 
            return redirect('/contactus')
                            ->withErrors($validator)
                            ->withInput();
        

        ContactUs::create($request->all());

        return redirect('/contactus');

Form Request Validation Documentation

Manually Creating Validators Documentation

我们可以像这样保持 ContactUsRequest

public function send(ContactUsRequest $request) 
        $validator = $request->validated();

        ContactUs::create($request->all());

        return redirect('/contactus');

【讨论】:

谢谢@foued-moussi。我添加了一些代码,希望它是正确的:) 还需要使用ContactUsRequest类oo :) 如果在您的send 方法中注入ContactUsRequest $request,则Validator::make() 将在失败的情况下被忽略。 认为我们不需要 t,因为该部分将使用自定义请求类处理。我可以将自定义请求类也添加到您的代码中,以便我可以接受;) 我错误地拒绝了你的建议编辑,你能重做吗?【参考方案2】:

这是因为请求对象会自动为您执行此操作,并且您无需手动重定向,并且 $validator 变量包含 validated inputs 因此在您的情况下您无需执行任何操作,您可以删除 if并安全重定向

public function send(ContactUsRequest $request) 
            ContactUs::create($request->validated());

            return redirect('/contactus');
        
    

【讨论】:

以上是关于使用 laravel 请求类时,在数组错误上调用成员函数失败()的主要内容,如果未能解决你的问题,请参考以下文章

laravel : count(): 参数必须是数组或实现 Countable 的对象

在 Laravel 5.6 中调用数组上的成员函数 links()

错误调用数组 Laravel 上的成员函数 where()

从 Laravel 5.2 更新到 5.3 后,调用数组上的成员函数 all()

Laravel 表单请求:调用错误的方法

Laravel 有没有办法向请求数组添加值