首页 > 后端开发 > php教程 > Laravel中的数据验证:正确的方式 - 自定义验证器

Laravel中的数据验证:正确的方式 - 自定义验证器

Christopher Nolan
发布: 2025-02-20 11:35:11
原创
292 人浏览过

Data Validation in Laravel: The Right Way - Custom Validators

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文档指出我们可以做到这一点:

<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>
登录后复制
登录后复制
并将其粘贴在app/start/global.php中,或者在应用程序目录中创建一个新文件,然后将该文件加载到app/start/global.php中。但这看起来并不干净,修改文件我们不需要修改,在这里和那里都贴上碎屑和碎片。不,我们宁愿将所有这些相关的代码放在一起,因此我们将创建一个服务提供商,并将我们的自定义验证规则粘合到Laravel的验证程序包中。

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中的数据。>
  1. >使用面向对象的方法将数据验证抽象为其自己的独立服务(
  2. 单一责任
  3. 成就已解锁)。 >创建我们自己的自定义异常,以与我们的数据验证服务一起使用(而不是使用true/false boolean值)以及如何存储和检索它们的错误。
  4. >在控制器中注入我们的数据验证服务并使用它。
  5. >
  6. >使用我们的自定义验证规则扩展了Laravel的验证软件包,并使用服务提供商自动加载它。
  7. >脚注
  8. 为了将本教程保留到我将验证服务注入我们的控制器并在此处使用的点。在一个真实的项目中,您很可能会在其他地方使用验证服务,在此处处理数据消毒和存储。理想情况下,控制器应不含脂肪,并且最少的代码。

有想法吗?问题?在评论中开火。

>关于Laravel数据验证和自定义验证器的常见问题


>使用Laravel进行数据验证有什么好处?它提供了各种验证规则,这些规则可以轻松地应用于您的数据,以确保在处理之前符合所需的标准。 Laravel的验证系统还允许自定义验证规则,使您能够定义自己的数据验证标准。当您需要以Laravel的内置验证规则不涵盖的方式验证数据时。您使用验证器:: Extend方法创建自定义验证规则。此方法采用两个参数:验证规则的名称和接收三个参数的闭合:属性名称,属性值和失败回调。在关闭中,您可以为自定义验证规则定义逻辑。如果验证失败,则应通过适当的错误消息调用失败回调。

>我可以将Laravel的内置验证规则与我的自定义规则一起使用吗?这可以通过在验证逻辑中将验证规则链接在一起来完成。例如,您可以使用“必需”规则来确保字段不是空的,然后使用自定义规则验证数据的格式。

>

如何在laravel中显示验证错误消息?

Laravel使您可以轻松在视图中显示验证错误消息。当验证失败时,Laravel将用户重定向到他们的先前位置,并在会话中存储了所有验证错误。然后,您可以使用$错误变量在视图中显示这些错误,该变量会自动通过Laravel提供。是的,Laravel允许您自定义验证规则自定义错误消息。这可以通过在语言文件中定义自定义消息,然后在验证逻辑中引用这些消息来完成。这使您可以灵活地根据应用程序的特定需求来量身定制错误消息。

>如何验证Laravel中的数组?

Laravel提供了一种使用“点表示”验证数组的方便方法。您可以指定要验证的数组字段,然后将验证规则应用于其。例如,如果您有一系列电子邮件,则可以使用“电子邮件”验证规则在数组中验证每个电子邮件。

>

>我可以在laravel中使用条件验证规则吗? Laravel允许您使用条件验证规则。这意味着您只有在满足其他条件时才可以应用某些验证规则。可以使用验证器实例上的有时方法来完成此操作。

如何在laravel中验证文件上传?图像','Mimes'和“大小”。这些规则允许您验证上载文件的类型和大小,以确保它符合您的应用程序的要求。

>

>我可以在表单请求中使用自定义验证规则吗?表单请求中的自定义验证规则。这可以通过在表单请求类的规则方法中定义规则来完成。然后,您可以在验证表单请求数据时使用这些规则。

>

>如何处理Laravel中的验证失败?

>

>当验证失败在Laravel中时,它会自动将用户重定向到他们的先前位置在会话中存储了所有验证错误。然后,您可以在视图中处理这些错误,以适合您的应用程序的方式显示给用户。>

以上是Laravel中的数据验证:正确的方式 - 自定义验证器的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板