类示例代码详解_php实例_脚本之家,关于Laravel参数验证的一些疑与惑_php实例_脚本之家

验证器怎么创建的,谁创建的

Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的
Validator::extend 方法的替代。

Laravel
文档调用验证器,除了通过控制器,还有就是通过Facades的方式创建验证器对象。Validator::make。

Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的
Validator::extend
方法的替代。。很多时候我们会直接用正则表达式来处理这种特殊的验证,也有时候我们会选择用
Validator::extend 来扩展一个自定义的规则。但在 Laravel 5.5
版本中,我们有了新的手段,只要定义一个实现
IlluminateContractsValidationRule
接口的类即可实现自定义的验证规则,并可以直接使用。

config/app.php 中注册了’Validator’ =>
IlluminateSupportFacadesValidator::class。

下面是一个简单的示例:

从上面可以看出,Validator的实际实现类是容器中的validator对象,那这个validator对象是哪个?namespace IlluminateFoundation;...class Application extends Container implements ApplicationContract, HttpKernelInterface{ ... public function registerCoreContainerAliases() { foreach ([ ... 'validator'=> [ IlluminateValidationFactory::class, IlluminateContractsValidationFactory::class ], ]) ... } ...}
use IlluminateContractsValidationRule;class IsOddValidationRule implements Rule{ public function passes { return ; } public function message() { return ':attribute 必须是奇数'; }}

可以看出,最终创建验证器是通过实现IlluminateContractsValidationFactory接口的IlluminateValidationFactory类创建的。再来看看,这个工厂类怎么创建实际的验证器的。

以上代码定义了一个 IsOddValidationRule 的自定义验证类,在 Controller
中要使用这个验证类的话,可以这样写:

//IlluminateContractsValidationFactory 源码protected function resolve(array $data, array $rules, array $messages, array $customAttributes){ if (is_null { return new Validator( $this->translator, $data, $rules, $messages, $customAttributes ); } return call_user_func( $this->resolver, $this->translator, $data, $rules, $messages, $customAttributes );}
public function handlForm{ $this->validate($request, [ 'oddField' => [new IsOddValidationRule] ]);}

到这里,可以看出Laravel的验证器的创建都是通过特定的工厂类创建。

同样的效果,也可以通过匿名函数来实现:

如果需要自定义验证器类(比如我需要把5.8的一些新功能迁移到5.5的版本上),有两种方式:

public function handleForm{ $this->validate($request, [ 'oddField' => [function($attributes, $value, $fail) { if  { $fail; } }] ]);}

一,创建一个自定义的工厂类。然后在AppServiceProvider中重新绑定新的验证器工厂创建类;

在验证的表单项为空值或者不存在的时候,对应的自定义验证规则不会执行。这个与系统自带的验证规则的逻辑是一致的。如果你希望你的自定义验证规则,即使是在对应的表单项为空值时也被执行的话,那么只要把继承的接口从
rule 改成 ImplicitRule 即可:

二,AppServiceProvider中通过resolver方法设置工厂类的resolver属性,接管验证器的实例化,例如:

class IsOddValidationRule implements ImplicitRule{ ...}
Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes){ return new ExtendValidator($translator, $data, $rules, $messages, $customAttributes);});

采用 Laravel 5.5
新增的自定义验证类,可以更好地管理大量的自定义验证规则,而且在 PHPStorm
之类的 IDE
中,从验证代码里快速跳转到对应的验证类的代码也会更方便。毕竟采用
Validator::extend
的话,你只能通过搜索对应验证类名称的字符串来找到规则定义的源代码。

如何自定义验证规则

匿名函数的自定义验证规则在一次性的简单验证逻辑中用起来确实会很方便,或者是在编码过程中快速测试验证逻辑也很实用。但是总的来说,还是建议采用更具组织性和可读性的自定义验证类。最佳方法是在编写
Controller
的过程中用匿名函数快速验证自定义规则,然后再把它移到自定义的验证类对象中。

Laravel本身提供了很多通用的参数验证规则,但是对于一些特定的场景,还是需要提供验证规则的扩展。

你可以查看该功能在 Laravel 框架的 github 上的 Pull Request
,阅读具体的实现代码以及相关的测试代码。

Laravel验证规则的扩展有两种方式。

参考

1 通过extend方法扩展

//这是一个简单的参数比较的验证规则,Laravel5.8中提供,Laravel5.5中未提供//验证规则如下: 'max_num'=>'gte:min',Validator::extend('gte',function($attribute, $value, $parameters, $validator){ if($value>=data_get,$parameters[0])) { return true; } return false;});

//IlluminateContractsValidationFactory 源码public function extend($rule, $extension, $message = null){ $this->extensions[$rule] = $extension; if  { $this->fallbackMessages[Str::snake] = $message; }}

//IlluminateValidationValidator 源码protected function callExtension{ $callback = $this->extensions[$rule]; if (is_callable { return call_user_func_array($callback, $parameters); } elseif  { return $this->callClassBasedExtension($callback, $parameters); }}protected function validateAttribute{ ... $method = "validate{$rule}"; if ($validatable && ! $this->$method($attribute, $value, $parameters, $this)) { $this->addFailure($attribute, $rule, $parameters); }}public function __call{ $rule = Str::snake; if (isset($this->extensions[$rule])) { return $this->callExtension; } throw new BadMethodCallException(sprintf( 'Method %s::%s does not exist.', static::class, $method ));}

总结

Factory提供了extend方法用于扩展规则验证方法。所有的扩展规则最终都会被传到验证器中。验证器在验证参数的过程中,如果找到匹配的验证规则,则直接进行验证。否则调用魔术方法__call查找扩展验证函数。扩展函数返回布尔值,返回true则表示验证通过,返回false表示验证失败。

以上所述是小编给大家介绍的Laravel 5.5
的自定义验证对象/类示例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

发表评论

电子邮件地址不会被公开。 必填项已用*标注