如何在 Laravel 控制器中编写自定义验证规则?

问题描述 投票:0回答:3

我在 Laravel 控制器中有默认的验证规则:

$validator = Validator::make($request->all(), [
            'email' => 'required|email',
            'phone' => 'required|numeric',
            'code' => 'required|string|min:3|max:4',
            'timezone' => 'required|numeric',
            'country' => 'required|integer',
            'agreement' => 'accepted'
        ]);

我尝试了这个,但不知道如何在函数内部传递一些参数:

 public function boot()
    {
        Validator::extend('phone_unique', function($attribute, $value, $parameters) {
            return substr($value, 0, 3) == '+44';
        });
    }

我如何通过自己的规则扩展此验证?例如,我需要验证输入的串联:

$phone = $request->code.' '.$request->phone

检查数据库中是否存在

$phone

我想用这个方法:

>  $validator->sometimes('phone', 'required|alpha_dash|max:25', function
> ($input) {
>             if ((Auth::user()->phone == $input->phone)) {
>                 return false;
> 
>             } else {
> 
>                 $t = User::where("phone", $input->phone)->get();
>                 return ($t->count() > 0) ? false : false;
> 
>             }
>         });

并非在所有条件下都可以工作

(True, False)
内部。

我添加了新的验证

nickname_unique

 $validator = Validator::make($request->all(), [
            'email' => 'required|email',
            'code' => 'required|string|min:3|max:4',
            'phone' => 'required|phone_unique',
            'timezone' => 'required|numeric',
            'country' => 'required|integer',
            'nickname' => 'required|alpha_dash|max:25',
            'agreement' => 'accepted'
        ], [
            'phone_unique' => 'Phone already exists!',
            'nickname_unique' => 'Nickname is busy!',
        ]);

它不起作用,甚至不调用前面的验证规则:

Validator::extend('nickname_unique', function ($attribute, $value, $parameters, $validator) {

            dd("Here");

});
laravel laravel-5.3
3个回答
12
投票

您可以在

AppServiceProvider
中定义自定义验证器,如下所示:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('phone_unique', function ($attribute, $value, $parameters, $validator) {
          $inputs = $validator->getData();
          $code = $inputs['code'];
          $phone = $inputs['phone'];
          $concatenated_number = $code . ' ' . $phone;
          $except_id = (!empty($parameters)) ? head($parameters) : null;

          $query = User::where('phone', $concatenated_number);
          if(!empty($except_id)) {
            $query->where('id', '<>', $except);
          }

          return $query->exists();
      });

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

您可以通过访问

$validator
属性来获取传递给验证器的所有输入 -
getData()

您可以在自定义验证规则之后(就在

colon
之后)向规则数组添加一个额外的参数,如下所示:

'phone' => 'required|phone_unique:1',

在检查数据库条目时传递要忽略的

id

自定义验证器闭包接收四个参数:正在验证的

$attribute
的名称、属性的
$value
、传递给规则的
$parameters
数组以及验证器实例。

现在你可以像这样调用验证器:

$validator = Validator::make($request->all(), [
      'email' => 'required|email',
      'code' => 'required|string|min:3|max:4',
      'phone' => 'required|phone_unique:1',
      'timezone' => 'required|numeric',
      'country' => 'required|integer',
      'agreement' => 'accepted'
  ], [
    'phone_unique' => 'Phone already exists!', // <---- pass a message for your custom validator
  ]);

查看有关自定义验证规则的更多信息。


5
投票

我写这个答案是因为我相信很多人正在为这个主题寻找一些好的答案。因此,我决定分享我用于预订网站的代码,我想在其中检查是否到达日期 > 出发日期。

我的

Laravel
版本是
5.3.30

public function postSolitudeStepTwo(Request $request)
{
    $rules = [
        'arrival_date' => 'required|date',
        'departure_date' => 'required|departure_date_check',
        'occasional_accompaniment_requested' => 'required|integer',
        'accommodation' => 'required|integer',
        'are_you_visiting_director' => 'required|integer',
    ];

    if ($request->input('are_you_visiting_director') == 1) {
        $rules['time_in_lieu'] = 'required|integer';
    }

    $messages = [
        'departure_date_check' => 'Departure date can\'t be smaller then Arrival date.Please check your dates.'
    ];

    $validation = validator(
        $request->toArray(),
        $rules,
        $messages
    );

    //If validation fail send back the Input with errors
    if($validation->fails()) {
        //withInput keep the users info
        return redirect()->back()->withInput()->withErrors($validation->messages());
    } else {
        MySession::setSessionData('arrival_date', $request);
        MySession::setSessionData('departure_date', $request);
        MySession::setSessionData('occasional_accompaniment_requested', $request);
        MySession::setSessionData('accommodation', $request);
        MySession::setSessionData('are_you_visiting_director', $request);
        MySession::setSessionData('time_in_lieu', $request);
        MySession::setSessionData('comment_solitude_step2_1', $request);

        //return $request->session()->all();
        return redirect("/getSolitudeStepThree");
    }
}

我的控制器是StepController,我在那里声明了一个方法,如您所见,称为 postSolitudeStepTwo。我宣布规则并在出发日期通知我们有

required|departure_date_check
的规则。这将是

中的方法名称
app/Providers/AppServiceProvider.php

那里的代码看起来像这样:

public function boot()
{
    Validator::extend('departure_date_check', function ($attribute, $value, $parameters, $validator) {
        $inputs = $validator->getData();
        $arrivalDate = $inputs['arrival_date'];
        $departureDate = $inputs['departure_date'];
        $result = true;
        if ($arrivalDate > $departureDate) {
            $result = false;
        }
        return $result;
    });
}

正如Laravel文档5.3自定义验证规则我们需要扩展Validator门面,该方法的签名必须是:

Validator::extend(name_of_the_function, function ($attribute, $value, $parameters, $validator) {

我相信剩下的就很清楚了。

希望它能帮助别人。


2
投票
$messsages = array(
        'email.required'=>'Email is Required',
        'phone.required'=>'Phone number is Required',

    );

    $rules = array(
        'email' => 'required',
        'phone' => 'required',

    );

    $validator = Validator::make(Input::all(), $rules,$messsages);



    if ($validator->fails()):
        $this->throwValidationException($request, $validator);
    endif;
© www.soinside.com 2019 - 2024. All rights reserved.