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 的格式