使用 Validator 在 Laravel 中验证用户输入

Posted

技术标签:

【中文标题】使用 Validator 在 Laravel 中验证用户输入【英文标题】:Validating user input in Laravel using the Validator 【发布时间】:2018-11-08 01:18:21 【问题描述】:

我正在尝试在 Laravel 中使用 RegisterController,但无法让 Validator 工作。我不明白问题是什么,因为它应该只需要一个数组并对其进行验证。

当我尝试将包含正确字段的 JSON 发送到注册路由时,我收到此错误:

BadMethodCallException: Method validate does not exist. in file /home/deb85528n3/vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php on line 96

下面是我的代码:

protected function validator(array $data)
       
    $validator = Validator::make($data,
        [
        'first_name' => 'required|string|max:255',
        'last_name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6|confirmed',
        'birth_year' => 'required|integer',
        'lat' => 'required',
        'lon' => 'required',
        ]);

    echo $validator->errors();

   if ($validator->fails())
   
        return response()->json(['errors'=>$validator->errors()]);
   

   if ($validator->passes())
   
        $response = "validator passed";
        return response()->json($response);
   


我还尝试以不同的方式使用验证器:

public function validator(Request $request)
    $validator = Validator::make($request->all(), [
        'first_name' => 'required|string|max:255',
        'last_name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6|confirmed',
        'birth_year' => 'required|integer|min:4',
        'lat' => 'required|numeric',
        'lon' => 'required|numeric',
    ]);

然后我得到这个错误:

Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to App\Http\Controllers\Auth\RegisterController::validator() must be an instance of App\Http\Controllers\Auth\Request, array given, called in /home/deb85528n3/vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php on line 31 in file /home/deb85528n3/app/Http/Controllers/Auth/RegisterController.php on line 103

编辑以包含整个 RegisterController:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller


use RegistersUsers;

/**
 * Where to redirect users after registration.
 *
 * @var string
 */
protected $redirectTo = '/home';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()

    $this->middleware('guest');


/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)

    $validator = Validator::make($data, [
        'first_name' => 'required|string|max:255',
        'last_name'  => 'required|string|max:255',
        'email'      => 'required|string|email|max:255|unique:users',
        'password'   => 'required|string|min:6|confirmed',
        'birth_year' => 'required|integer|min:4',
        'lat'        => 'required|numeric',
        'lon'        => 'required|numeric',
    ]);


    echo $validator->errors();

   if ($validator->fails())
   
        return response()->json(['errors'=>$validator->errors()]);
    

    if ($validator->passes())
    
        $response = "validator passed";
        return response()->json($response);
    



/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\User
 */
protected function create(array $data)

    //maybe check if facebook login here?
    return User::create([
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'birth_year' => $data['birth_year'],
        'lat' => $data['lat'],
        'lon' => $data['lon'],
    ]);

【问题讨论】:

你能发布你的全班吗?或者顶部的导入(听起来您应该在顶部有 use Illuminate\Http\Request; 但这可能不是全部问题。这是指您的第二个示例) 你使用的是什么版本的 Laravel? $validator = Validator::make($request-&gt;all(), 抛出错误,因为$request-&gt;all() 返回一个数组。这是合乎逻辑的。只需将请求作为参数给它。第一个我不明白。 我更新了全班同学的问题 我使用的是 Laravel 5.5.24 【参考方案1】:

register 方法调用validator 方法并传递一个数组,然后它期望返回一个\Illuminate\Contracts\Validation\Validator 的实例。

除非您需要覆盖注册用户的默认响应,否则您应该能够:

public function validator(array $data)

    return Validator::make($data, [
        'first_name' => 'required|string|max:255',
        'last_name'  => 'required|string|max:255',
        'email'      => 'required|string|email|max:255|unique:users',
        'password'   => 'required|string|min:6|confirmed',
        'birth_year' => 'required|integer|min:4',
        'lat'        => 'required|numeric',
        'lon'        => 'required|numeric',
    ]);

【讨论】:

我现在收到错误 Symfony\Component\Debug\Exception\FatalThrowableError: Call to a member function validate() on null in file /home/deb85528n3/vendor/laravel/framework/src/Illuminate/ Foundation/Auth/RegistersUsers.php 第 31 行 @kajdehoop 你能把你的整个RegisterController 贴出来吗?另外你使用的是什么版本的 Laravel? 我已经发布了整个 RegisterController。我正在使用 Laravel 5.5.24 @kajdehoop 我的错,我忘了返回验证器。上面的代码应该适合你。 它现在可以在验证通过时工作(:但是当它失败时,它不会返回错误。我想要一个带有未通过验证的字段的 JSON 响应 【参考方案2】:

更改你的函数名称

use Validator;

将此添加到您的控制器中,

删除这个

public function validator(Request $request)

在模型中写下你的验证规则,如下所示

 public static function rules()
    
       return [
         'first_name' => 'required|string|max:255',
         'last_name' => 'required|string|max:255',
         'email' => 'required|string|email|max:255|unique:users',
         'password' => 'required|string|min:6|confirmed',
         'birth_year' => 'required|integer|min:4',
         'lat' => 'required|numeric',
         'lon' => 'required|numeric',
       ];
     

并在您的控制器中调用此规则

 $validator = Validator::make($request->all(), "Your model Name"::rules()); 
  if ($validator->fails()) 
        //throw exception
    

【讨论】:

“型号名称”是什么意思?为了注册新用户,我应该把它放在 User 模型中吗? 是的,你可以在用户模型中编写

以上是关于使用 Validator 在 Laravel 中验证用户输入的主要内容,如果未能解决你的问题,请参考以下文章

11.Laravel5学习笔记:扩展 Validator 类

如何使用 Laravel 框架的 validator

laravel validator怎么验证整数

如何将自定义验证消息传递给 laravel 中的 cviebrock/image-validator?

在 Laravel 4 中返回 Input::except() 多个输入

laravel validator提示信息中文化