Laravel 自定义表单验证-自定义验证规则

前言

现在客户表有2个手机字段(phone,server_phone),不管插入还是编辑都需要对2个手机号进行验证判重规则。但是如果用Laravel自己的unique规则的话,无法使用orWhere 方法。

Unique规则
select count ( * ) as aggregate from client where phone = '15706844651' and id <> '111111' and reserve_phone = '15706844651'

不符合在自己业务逻辑

步骤

建立自己的验证规则文件

<?php
namespace App\Validators;
use App\Models\Client\Client;
/**
 * Class PhoneValidator.
 */
class UniquePhoneValidator
{
    public function validate($attribute, $value, $parameters, $validator)
    {
        if($parameters){
            return Client::where(function ($query) use ($value){
                $query->where('phone',$value)->orWhere('server_phone',$value);
            })->whereNotIn('id',$parameters)->withTrashed() ? false : true;
        }
        return Client::where(function ($query) use ($value){
            $query->where('phone',$value)->orWhere('server_phone',$value);
        })->withTrashed() ? false : true;
    }
}

AppServiceProvider 中引入验证

    protected $validators = [
        'unique_phone' => UniquePhoneValidator::class,
    ];

    public function boot()
    {
        $this->registerValidators();
    }

    protected function registerValidators()
    {
        foreach ($this->validators as $rule => $validator) {
            Validator::extend($rule, "{$validator}@validate");
        }
    }

在FormRquest 里面中使用该规则

class MyClientRequest extends FormRequest
{
public function rules()
    {
        if($this->method() == 'POST'){
            return [
                'phone' => 'filled|int|unique_phone',
                'reserve_phone' => 'filled|int|unique_phone',
            ];
        } elseif ($this->method() == 'PUT'){
            return [
                'phone' => 'filled|int|unique_phone:'.$this->route('client'),
                'reserve_phone' => 'filled|int|unique_phone,'.$this->route('client'),
            ];
        }
    }
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

谢谢你的分享,给了我提示! 我现在要做的,自定义验证方法是: users表的两个字段:countrycode国别,phone手机号,的唯一性, 也可以理解为两个连在一起时是唯一的,比如:861890000001, 并且当国别为86时,对大陆手机号再进行正则验证。其他国家的就只要是数字即可。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!