Laravel中的数据验证:正确的方式 - 自定义验证器
钥匙要点
-
可以扩展Laravel的内置数据验证软件包,以为特定需求创建自定义验证规则,例如验证包含空格的全名代码或PIN代码。
- 通过扩展Laravel的IlluminateValidationValidator类并添加新方法来验证数据及其各自的错误消息,可以创建自定义验证规则。 >
- >新的验证规则必须用“ validate”前缀和标题案例中的其余名称命名。验证规则将在该方法所命名的内容(没有“ validate”前缀)的小写中,每个单词将被下划线分开。
> 创建自定义验证规则后,需要创建服务提供商将这些规则绑定到Laravel的验证包中。然后,通过app/config/app.php文件,Laravel加载了此服务提供商
- 在上一部分中,我们学会了如何使用其内置数据验证软件包验证Laravel中的数据,以及如何将我们的数据验证抽象为特定的特定服务,以使代码可重复使用Dry原理。现在,我们可以通过其各自的验证规则为我们的应用程序中的每个实体创建验证服务,并将其注入到我们要验证数据并轻松获取和显示错误等的任何位置等。 但是,如果我们想要更多?
- >
本教程的源代码可在此处提供。您只需要在能够运行此代码之前运行Composer安装即可在项目目录内安装Laravel Framework。
需要更多
开箱即用的> Laravel提供了许多有用且通用的验证规则。但是,如果我们想要更多呢?如果我们需要更具体的东西怎么办?在我们的示例中,在TestFormValidator中,我们使用alpha_dash来验证名称,但这不是验证全名的理想选择。通常,一个人的全名将包括一个名字和姓氏,也许还有一个中间名。所有这些都将被一个空间隔开。同样,如果我们想以形式验证PIN代码,我们不能使用Laravel提供的Alpha_num规则,我们也应该能够允许其中的空间。> 好吧,Laravel提供了轻松扩展其验证软件包并向其添加自定义验证规则的选项。在RocketCandy/services/验证/Create validatorextended.php中,并向其添加以下代码:
> <span><span><?php </span></span><span> </span><span><span>namespace RocketCandy<span>\Services\Validation</span>; </span></span><span> </span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator; </span></span><span> </span><span><span>class ValidatorExtended extends IlluminateValidator { </span></span><span> </span><span> <span>private $_custom_messages = array( </span></span><span> <span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.", </span></span><span> <span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.", </span></span><span> <span>); </span></span><span> </span><span> <span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) { </span></span><span> <span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes ); </span></span><span> </span><span> <span>$this->_set_custom_stuff(); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Setup any customizations etc </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>protected function _set_custom_stuff() { </span></span><span> <span>//setup our custom error messages </span></span><span> <span>$this->setCustomMessages( $this->_custom_messages ); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Allow only alphabets, spaces and dashes (hyphens and underscores) </span></span><span><span> * </span></span><span><span> * <span>@param <span>string</span> $attribute </span></span></span><span><span> * <span>@param <span>mixed</span> $value </span></span></span><span><span> * <span>@return <span>bool</span> </span></span></span><span><span> */ </span></span><span> <span>protected function validateAlphaDashSpaces( $attribute, $value ) { </span></span><span> <span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value ); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Allow only alphabets, numbers, and spaces </span></span><span><span> * </span></span><span><span> * <span>@param <span>string</span> $attribute </span></span></span><span><span> * <span>@param <span>mixed</span> $value </span></span></span><span><span> * <span>@return <span>bool</span> </span></span></span><span><span> */ </span></span><span> <span>protected function validateAlphaNumSpaces( $attribute, $value ) { </span></span><span> <span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value ); </span></span><span> <span>} </span></span><span> </span><span><span>} //end of class </span></span><span> </span><span> </span><span><span>//EOF</span></span>登录后复制登录后复制>在这里,我们的同类将Laravel的IlluminateValidationValidator类扩展并添加了两种新方法(dialatealphadashspaces()和varteratealatealphanumspaces()),以验证数据及其各自的错误消息与占位符:属性:属性中的attribute中的属性将在其中替换为runavel,以替换为运行时的名称。正在验证的数据字段。
现在要注意的是我们如何命名方法。所有验证规则方法名称必须具有验证前缀,其余的必须在标题案例中(当然没有空格)。验证规则将以命名方法的小写(无验证前缀)为小写,每个单词将被下划线分开。因此,如果我们要添加alpha_dash_spaces验证规则,那么我们的相应方法将被命名为dialatealphadashspaces()。
因此,我们在此处添加了Alpha_Dash_spaces和Alpha_num_spaces验证规则。 alpha_dash_spaces将允许字母,破折号(连字符和下划线)和空格,而Alpha_num_spaces将仅允许字母,数字(数字0-9)和空格。
>>我们尚未完成此课程,此类仅扩展了Laravel的验证类。我们仍然必须使Laravel认识到它,以便当我们将新规则添加到上面的Vaidation服务中时,Laravel将知道如何根据这些规则进行验证。
laravel文档指出我们可以做到这一点:
并将其粘贴在app/start/global.php中,或者在应用程序目录中创建一个新文件,然后将该文件加载到app/start/global.php中。但这看起来并不干净,修改文件我们不需要修改,在这里和那里都贴上碎屑和碎片。不,我们宁愿将所有这些相关的代码放在一起,因此我们将创建一个服务提供商,并将我们的自定义验证规则粘合到Laravel的验证程序包中。<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) { </span> <span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages ); </span><span>} );</span>登录后复制登录后复制create verialationExtensionserviceProvider.php rocketcandy/services/verasonation/incem of tastectenserviceprovider.php/添加以下代码:
> 如果您已经在Laravel创建了一个服务提供商,则通常使用register()方法来执行所需的任何绑定。这是我们在这里扩展的抽象类LimuminateUpporterServiceProvider中唯一的抽象方法。我们之所以无法将验证扩展粘合到register()中,是因为一旦服务提供商加载了Laravel,就会触发它,我们将遇到一个抛出的异常,因为Laravel以后将其验证套件初始化,因此我们将稍后初始化其验证包,因此我们将尝试使用不存在的对象扩展不存在的东西。另一方面,启动()方法是在请求路由之前触发的,因此我们可以将其安全地粘贴到Laravel的验证包中。
><span><span><?php </span></span><span> </span><span><span>namespace RocketCandy<span>\Services\Validation</span>; </span></span><span> </span><span><span>use Illuminate<span>\Support\ServiceProvider</span>; </span></span><span> </span><span><span>class ValidationExtensionServiceProvider extends ServiceProvider { </span></span><span> </span><span> <span>public function register() {} </span></span><span> </span><span> <span>public function boot() { </span></span><span> <span>$this->app->validator->resolver( function( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) { </span></span><span> <span>return new ValidatorExtended( $translator, $data, $rules, $messages, $customAttributes ); </span></span><span> <span>} ); </span></span><span> <span>} </span></span><span> </span><span><span>} //end of class </span></span><span> </span><span> </span><span><span>//EOF</span></span>登录后复制>现在,我们只需要告诉Laravel加载此服务提供商,我们将全部设置。打开您的应用程序/config/app.php,在提供商数组中添加以下内容:
> <span><span><?php </span></span><span> </span><span><span>namespace RocketCandy<span>\Services\Validation</span>; </span></span><span> </span><span><span>use Illuminate<span>\Validation\Validator</span> as IlluminateValidator; </span></span><span> </span><span><span>class ValidatorExtended extends IlluminateValidator { </span></span><span> </span><span> <span>private $_custom_messages = array( </span></span><span> <span>"alpha_dash_spaces" => "The :attribute may only contain letters, spaces, and dashes.", </span></span><span> <span>"alpha_num_spaces" => "The :attribute may only contain letters, numbers, and spaces.", </span></span><span> <span>); </span></span><span> </span><span> <span>public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) { </span></span><span> <span><span>parent::</span>__construct( $translator, $data, $rules, $messages, $customAttributes ); </span></span><span> </span><span> <span>$this->_set_custom_stuff(); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Setup any customizations etc </span></span><span><span> * </span></span><span><span> * <span>@return <span>void</span> </span></span></span><span><span> */ </span></span><span> <span>protected function _set_custom_stuff() { </span></span><span> <span>//setup our custom error messages </span></span><span> <span>$this->setCustomMessages( $this->_custom_messages ); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Allow only alphabets, spaces and dashes (hyphens and underscores) </span></span><span><span> * </span></span><span><span> * <span>@param <span>string</span> $attribute </span></span></span><span><span> * <span>@param <span>mixed</span> $value </span></span></span><span><span> * <span>@return <span>bool</span> </span></span></span><span><span> */ </span></span><span> <span>protected function validateAlphaDashSpaces( $attribute, $value ) { </span></span><span> <span>return (bool) preg_match( "/^[A-Za-z\s-_]+$/", $value ); </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Allow only alphabets, numbers, and spaces </span></span><span><span> * </span></span><span><span> * <span>@param <span>string</span> $attribute </span></span></span><span><span> * <span>@param <span>mixed</span> $value </span></span></span><span><span> * <span>@return <span>bool</span> </span></span></span><span><span> */ </span></span><span> <span>protected function validateAlphaNumSpaces( $attribute, $value ) { </span></span><span> <span>return (bool) preg_match( "/^[A-Za-z0-9\s]+$/", $value ); </span></span><span> <span>} </span></span><span> </span><span><span>} //end of class </span></span><span> </span><span> </span><span><span>//EOF</span></span>登录后复制登录后复制现在,打开app/rocketcandy/services/validation/testformvalidator.php并更新$规则属性,以便看起来像这样:
<span>Validator<span>::</span>resolver( function( $translator, $data, $rules, $messages ) { </span> <span>return new <span>\RocketCandy\Services\Validation\ValidatorExtended</span>( $translator, $data, $rules, $messages ); </span><span>} );</span>登录后复制登录后复制我们用alpha_dash_spaces替换了名称的alpha_dash验证规则,用alpha_num_spaces替换了pin_code的alpha_num。
现在,如果我们导航到http:///dummy/create,我们可以在“名称和PIN代码”字段中输入空格,而没有任何问题,并且数据将在提交上传递验证。 >
摘要因此,在这两个部分教程中,我们学会了:
>
>使用其内置的数据验证软件包验证Laravel中的数据。
> - >使用面向对象的方法将数据验证抽象为其自己的独立服务(
单一责任- 成就已解锁)。 >创建我们自己的自定义异常,以与我们的数据验证服务一起使用(而不是使用true/false boolean值)以及如何存储和检索它们的错误。
>在控制器中注入我们的数据验证服务并使用它。- >
>使用我们的自定义验证规则扩展了Laravel的验证软件包,并使用服务提供商自动加载它。- >脚注
为了将本教程保留到我将验证服务注入我们的控制器并在此处使用的点。在一个真实的项目中,您很可能会在其他地方使用验证服务,在此处处理数据消毒和存储。理想情况下,控制器应不含脂肪,并且最少的代码。有想法吗?问题?在评论中开火。
>关于Laravel数据验证和自定义验证器的常见问题
>使用Laravel进行数据验证有什么好处?它提供了各种验证规则,这些规则可以轻松地应用于您的数据,以确保在处理之前符合所需的标准。 Laravel的验证系统还允许自定义验证规则,使您能够定义自己的数据验证标准。当您需要以Laravel的内置验证规则不涵盖的方式验证数据时。您使用验证器:: Extend方法创建自定义验证规则。此方法采用两个参数:验证规则的名称和接收三个参数的闭合:属性名称,属性值和失败回调。在关闭中,您可以为自定义验证规则定义逻辑。如果验证失败,则应通过适当的错误消息调用失败回调。>我可以将Laravel的内置验证规则与我的自定义规则一起使用吗?这可以通过在验证逻辑中将验证规则链接在一起来完成。例如,您可以使用“必需”规则来确保字段不是空的,然后使用自定义规则验证数据的格式。
>如何在laravel中显示验证错误消息?
Laravel使您可以轻松在视图中显示验证错误消息。当验证失败时,Laravel将用户重定向到他们的先前位置,并在会话中存储了所有验证错误。然后,您可以使用$错误变量在视图中显示这些错误,该变量会自动通过Laravel提供。是的,Laravel允许您自定义验证规则自定义错误消息。这可以通过在语言文件中定义自定义消息,然后在验证逻辑中引用这些消息来完成。这使您可以灵活地根据应用程序的特定需求来量身定制错误消息。
>如何验证Laravel中的数组?
Laravel提供了一种使用“点表示”验证数组的方便方法。您可以指定要验证的数组字段,然后将验证规则应用于其。例如,如果您有一系列电子邮件,则可以使用“电子邮件”验证规则在数组中验证每个电子邮件。
>>我可以在laravel中使用条件验证规则吗? Laravel允许您使用条件验证规则。这意味着您只有在满足其他条件时才可以应用某些验证规则。可以使用验证器实例上的有时方法来完成此操作。
如何在laravel中验证文件上传?图像','Mimes'和“大小”。这些规则允许您验证上载文件的类型和大小,以确保它符合您的应用程序的要求。
>>我可以在表单请求中使用自定义验证规则吗?表单请求中的自定义验证规则。这可以通过在表单请求类的规则方法中定义规则来完成。然后,您可以在验证表单请求数据时使用这些规则。
>>如何处理Laravel中的验证失败?
>
>当验证失败在Laravel中时,它会自动将用户重定向到他们的先前位置在会话中存储了所有验证错误。然后,您可以在视图中处理这些错误,以适合您的应用程序的方式显示给用户。>
以上是Laravel中的数据验证:正确的方式 - 自定义验证器的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
