作为程序员一定要保持良好的睡眠,才能好编程

laravel 中Validator扩展详细用法详解

发布时间:2020-01-18


laravel验证器并没有完全满足我们的验证需求,有些验证规则需要进行扩展。


比如说 手机号 验证


扩展要求:


1、扩展类可以注册到laravel容器中

2、支持多个扩展


laravel注册验证器类的流程是:

index.php --->bootstrap/app.php

实例化     
$app = new Illuminate\Foundation\Application

public function __construct($basePath = null)
{
    if ($basePath) {
        $this->setBasePath($basePath);
    }

    $this->registerBaseBindings();
    $this->registerBaseServiceProviders();
    $this->registerCoreContainerAliases();  //注册核心到容器
    
    
找到 registerCoreContainerAliases 这个方法,就能看到使用的核心功能

public function registerCoreContainerAliases()
{
    foreach ([
        'app'                  => [self::class, \Illuminate\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container\ContainerInterface::class],
        'auth'                 => [\Illuminate\Auth\AuthManager::class, \Illuminate\Contracts\Auth\Factory::class],
        'auth.driver'          => [\Illuminate\Contracts\Auth\Guard::class],
        'blade.compiler'       => [\Illuminate\View\Compilers\BladeCompiler::class],
        'cache'                => [\Illuminate\Cache\CacheManager::class, \Illuminate\Contracts\Cache\Factory::class],
        'cache.store'          => [\Illuminate\Cache\Repository::class, \Illuminate\Contracts\Cache\Repository::class, \Psr\SimpleCache\CacheInterface::class],
        'cache.psr6'           => [\Symfony\Component\Cache\Adapter\Psr16Adapter::class, \Symfony\Component\Cache\Adapter\AdapterInterface::class, \Psr\Cache\CacheItemPoolInterface::class],
        'config'               => [\Illuminate\Config\Repository::class, \Illuminate\Contracts\Config\Repository::class],
        'cookie'               => [\Illuminate\Cookie\CookieJar::class, \Illuminate\Contracts\Cookie\Factory::class, \Illuminate\Contracts\Cookie\QueueingFactory::class],
        'encrypter'            => [\Illuminate\Encryption\Encrypter::class, \Illuminate\Contracts\Encryption\Encrypter::class],
        'db'                   => [\Illuminate\Database\DatabaseManager::class, \Illuminate\Database\ConnectionResolverInterface::class],
        'db.connection'        => [\Illuminate\Database\Connection::class, \Illuminate\Database\ConnectionInterface::class],
        'events'               => [\Illuminate\Events\Dispatcher::class, \Illuminate\Contracts\Events\Dispatcher::class],
        'files'                => [\Illuminate\Filesystem\Filesystem::class],
        'filesystem'           => [\Illuminate\Filesystem\FilesystemManager::class, \Illuminate\Contracts\Filesystem\Factory::class],
        'filesystem.disk'      => [\Illuminate\Contracts\Filesystem\Filesystem::class],
        'filesystem.cloud'     => [\Illuminate\Contracts\Filesystem\Cloud::class],
        'hash'                 => [\Illuminate\Hashing\HashManager::class],
        'hash.driver'          => [\Illuminate\Contracts\Hashing\Hasher::class],
        'translator'           => [\Illuminate\Translation\Translator::class, \Illuminate\Contracts\Translation\Translator::class],
        'log'                  => [\Illuminate\Log\LogManager::class, \Psr\Log\LoggerInterface::class],
        'mailer'               => [\Illuminate\Mail\Mailer::class, \Illuminate\Contracts\Mail\Mailer::class, \Illuminate\Contracts\Mail\MailQueue::class],
        'auth.password'        => [\Illuminate\Auth\Passwords\PasswordBrokerManager::class, \Illuminate\Contracts\Auth\PasswordBrokerFactory::class],
        'auth.password.broker' => [\Illuminate\Auth\Passwords\PasswordBroker::class, \Illuminate\Contracts\Auth\PasswordBroker::class],
        'queue'                => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class],
        'queue.connection'     => [\Illuminate\Contracts\Queue\Queue::class],
        'queue.failer'         => [\Illuminate\Queue\Failed\FailedJobProviderInterface::class],
        'redirect'             => [\Illuminate\Routing\Redirector::class],
        'redis'                => [\Illuminate\Redis\RedisManager::class, \Illuminate\Contracts\Redis\Factory::class],
        'request'              => [\Illuminate\Http\Request::class, \Symfony\Component\HttpFoundation\Request::class],
        'router'               => [\Illuminate\Routing\Router::class, \Illuminate\Contracts\Routing\Registrar::class, \Illuminate\Contracts\Routing\BindingRegistrar::class],
        'session'              => [\Illuminate\Session\SessionManager::class],
        'session.store'        => [\Illuminate\Session\Store::class, \Illuminate\Contracts\Session\Session::class],
        'url'                  => [\Illuminate\Routing\UrlGenerator::class, \Illuminate\Contracts\Routing\UrlGenerator::class],
        'validator'            => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class],
        'view'                 => [\Illuminate\View\Factory::class, \Illuminate\Contracts\View\Factory::class],
    ] as $key => $aliases) {
        foreach ($aliases as $alias) {
            $this->alias($key, $alias);
        }
    }
}
    

在里面可以清晰的看的到  validator 这个类,我们只需要将这个类的实现给重写了即可


操作步骤:

后续完成

'validator'            => [\Illuminate\Validation\Factory::class, \Illuminate\Contracts\Validation\Factory::class],






laravel中现带有的规则:

accepted 字段值为yes/on/1时会通过

active_url 通过checkdnsrr来验证是否为一个有效的网址

after:date 通过strtotime来验证是否在指定日期之后

alpha 仅为全字母时通过验证

alpha_dash 仅允许字母、数字、-、_ 通过验证

alpha_num 仅允许字母、数字通过验证

array 仅为数组

before:date 通过strtotime来验证是否在指定日期之前

between:min,max 验证介于min和max之间

confirmed 验证与对应字段的*_confirmation一致,如password必须和password_confirmation一致

date 通过strtotime来验证是否合法

date_format:format 通过date_parse_from_format来验证format制定格式的日期是否合法

different:field 字段需要与指定的字段field值不同

digits:value 需要长度为value的数字

digits_between:min,max 需要介于min和max之间的数字

boolean 字段必须可以转换为bool值,如:true, false, 1, 0, “1”, “0”

email 需要符合email格式

exists:table,column 与存在于数据库中table的column字段值其一相同

image 必须为图片,jpeg, png, bmp, gif 或 svg

in:foo,bar,… 需要符合事先给予的清单中的其中一个值

integer 需要整数

ip 需要符合IP格式

max:value 小于value

mimes:foo,bar,… 文件MIME类需要在给定清单中的列表中才能通过验证

min:value 需大于等于value

not_in:foo,bar,… 不属于给定清单中的其一

numeric 需要数字

regex:pattern 符合给定正则

required 必填

required_if:field,value 在 field 字段值为 value 时为必填

required_with:foo,bar,… 仅在 任一指定字段有值情况下为必填

required_with_all:foo,bar,… 仅在 所有指定字段皆有值情况下为必填

required_without:foo,bar,… 仅在 任一指定字段没有值情况下为必填

required_without_all:foo,bar,… 仅在 所有指定字段皆没有值情况下为必填

same:field 需与指定字段 field 等值

size:value 需符合给定 value 值

timezone timezone_identifiers_list 函数来验证是否为有效的时区

unique:table,column,except,idColumn 在给定的数据库中需为唯一值

url filter_var 方法验证是否符合 URL 的格式