Laravel 5.4 - 如何对同一自定义验证规则使用多个错误消息

2024-01-16

为了重用代码,我在名为的文件中创建了自己的验证器规则验证服务提供者 :

class ValidatorServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Validator::extend('checkEmailPresenceAndValidity', function ($attribute, $value, $parameters, $validator) {
            $user = User::where('email', $value)->first();
            
            // Email has not been found
            if (! $user) {
                return false;
            }
            
            // Email has not been validated
            if (! $user->valid_email) {
                return false;
            }
            
            return true;
        });
    }

    public function register()
    {
        //
    }
}

我这样使用这个规则:

public function rules()
{
    return [
        'email' => 'bail|required|checkEmailPresenceAndValidity'
    ];
}

但是,我想为每种情况设置不同的错误消息,如下所示:

if (! $user) {
    $WHATEVER_INST->error_message = 'email not found';
    return false;
}
        
if (! $user->valid_email) {
    $WHATEVER_INST->error_message = 'invalid email';
    return false;
}

但我不知道如何在不执行两条不同规则的情况下实现这一目标......
当然,它可以使用多个规则,但它也会执行多个 SQL 查询,我真的想避免这种情况。
另外,请记住,在实际情况下,我可以在一条规则中进行超过 2 个这样的验证。

有人有主意吗?

=====
编辑1:

实际上,我认为我想要一些与between or size rules.
它们代表一条规则,但提供多条错误消息:

'size'                 => [
    'numeric' => 'The :attribute must be :size.',
    'file'    => 'The :attribute must be :size kilobytes.',
    'string'  => 'The :attribute must be :size characters.',
    'array'   => 'The :attribute must contain :size items.',
],

Laravel 检查该值是否表示数字、文件、字符串或数组;并获取正确的错误消息以供使用。
我们如何通过自定义规则来实现这种事情?


不幸的是,Laravel 目前没有提供直接从属性参数数组添加和调用验证规则的具体方法。但这并不排除基于以下基础的潜在且友好的解决方案:Trait and Request usage.

例如,请在下面找到我的解决方案。

首先是等待表单被处理,以便我们自己使用抽象类来处理表单请求。你需要做的是获取当前Validator实例并阻止它在存在任何相关错误时进行进一步验证。否则,您将存储验证器实例并调用稍后创建的自定义用户验证规则函数:

<?php

namespace App\Custom\Validation;

use \Illuminate\Foundation\Http\FormRequest;

abstract class MyCustomFormRequest extends FormRequest
{
    /** @var \Illuminate\Support\Facades\Validator */
    protected $v = null;

    protected function getValidatorInstance()
    {
        return parent::getValidatorInstance()->after(function ($validator) {
            if ($validator->errors()->all()) {
                // Stop doing further validations
                return;
            }
            $this->v = $validator;
            $this->next();
        });
    }

    /**
     * Add custom post-validation rules
     */
    protected function next()
    {
        
    }
}

下一步是创建您的Trait由于当前的验证器实例,这将提供验证您的输入的方法,并处理您想要显示的正确错误消息:

<?php

namespace App\Custom\Validation;

trait CustomUserValidations
{
    protected function validateUserEmailValidity($emailField)
    {
        $email = $this->input($emailField);

        $user = \App\User::where('email', $email)->first();
        
        if (! $user) {
            return $this->v->errors()->add($emailField, 'Email not found');
        }
        if (! $user->valid_email) {
            return $this->v->errors()->add($emailField, 'Email not valid');
        }

        // MORE VALIDATION POSSIBLE HERE
        // YOU CAN ADD AS MORE AS YOU WANT
        // ...
    }
}

最后,别忘了延长你的时间MyCustomFormRequest。例如,在您之后php artisan make:request CreateUserRequest,这是执行此操作的简单方法:

<?php

namespace App\Http\Requests;

use App\Custom\Validation\MyCustomFormRequest;
use App\Custom\Validation\CustomUserValidations;

class CreateUserRequest extends MyCustomFormRequest
{
    use CustomUserValidations;

    /**
     * Add custom post-validation rules
     */
    public function next()
    {
        $this->validateUserEmailValidity('email');
    }

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => 'bail|required|email|max:255|unique:users',
            'password' => 'bail|required',
            'name' => 'bail|required|max:255',
            'first_name' => 'bail|required|max:255',
        ];
    }
}

我希望你能按照我的建议找到自己的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 5.4 - 如何对同一自定义验证规则使用多个错误消息 的相关文章

  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia
  • 我可以让 swagger-php 在查询字符串上使用数组吗?

    我使用 Swagger php 当我定义查询字符串上的参数时 它可以是一个数组 但据我所知 它不支持这种查询字符串 https api domain tld v1 objects q 1 q 5 q 12 我相信这会被设定in the co
  • 如何使用正则表达式在 Java 中检查确切的电话号码

    你好 我是正则表达式的新手 我不知道我在做什么 这就是我寻求帮助的原因 我有以下电话号码 359878123456 我需要检查该电话号码是否符合条件 359 是准确的扩展名 第二个 2 个数字是操作员号码和以下 3 个数字之一 87 88
  • 此集合实例上不存在属性 [子类别]

    第一次与eloquent关系 我正在尝试访问subcategory method但我收到这个错误 此集合实例上不存在属性 子类别 Laravel 新手 因此任何帮助将不胜感激 blade table class table thead tr
  • Laravel S3 检索视频以流式传输

    我通过 Laravel 应用程序将视频存储到 Amazon S3 效果很好 但我无法 流式传输 它们 这是例如 URL https website com video 342 qt api token a5a18c9f f5f6 5d66
  • 如何对 SQL 进行多次查询

    我正在尝试创建一个表 并在 PHP 脚本的帮助下在数据库中插入一些值 虽然只插入 1 行 但效果很好 当我尝试输入更多行数时 出现错误 我需要为每个查询编写完整的插入语句 因为我正在使用在线 Excel 到 SQL 查询转换器
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • PHP - 类外 use 关键字和类内 use 关键字的区别

    伙计们 美好的一天 只是想问一下有什么区别use之外的class and use在 的里面class 我也用谷歌搜索过 但我的问题与答案不匹配 Example namespace App Http Controllers Auth use
  • 获取字符串中的最后一个整数

    我需要隔离包含多个整数的字符串中最新出现的整数 我怎样才能得到23代替1 for lastnum1 text 1 out of 23 lastnum1 this gt getEval eregi replace out of text 你可
  • 通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点?

    今年夏天我安装了两个不同的 PHP 系统 每个都使用两种不同的方法 方法 1 每个任务一个 PHP 文件 该方法需要一个PHP为每个主要任务创建文件 例如 我的上传脚本可以通过http www domain com upload php O
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • PHP 扩展开发入门 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 请推荐有关 PHP 低 级 modules 编程接口的帮助文章或教程 搜索我的书签 我发现的唯一链接是
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • PHP print_r() 中 _r 的含义是什么?

    我见过这个答案 https stackoverflow com questions 13103410 what does r suffix mean就这样 但我不确定它对于 PHP 是否相同 如果是 可重入的含义是什么 From PHP n
  • Ebay api GetSellerList,解析响应 XML

    我正在使用 eBay 交易 api 来获取当前列出的卖家股票 我正在使用 GetSellerList 调用 我在解析 xml 时遇到问题 然后将其插入到网站商店中 这是 xml 请求
  • 如何从 Laravel 执行存储过程

    我需要在表单提交数据后执行存储过程 我让存储过程按照我想要的方式工作 并且我的表单正常工作 我只是不知道从 laravel 5 执行 sp 的语句 它应该是这样的 执行 my stored procedure 但我似乎在网上找不到类似的东西
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • Stream_context_set_params 不适用于 ssh2.sftp 包装器

    我想使用类似的功能here http www php net manual en function stream notification callback php 请检查以下代码 function notify notification
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for

随机推荐

  • Rails:在 mail_to 链接中包含 html

    我正在寻找一种在 mail to 链接中包含 html 的方法 以便我可以自动在此电子邮件的正文中包含横幅 感谢您的任何提示 Markus Rails 3 mail to email protected cdn cgi l email pr
  • 如何清除Chromium浏览器的图标缓存

    我更新了浏览器选项卡上显示的网站图标 我清除了chromium浏览器 Ubuntu版本的Chrome 的数据 清除浏览数据 gt 选择 从头开始 并检查所有内容 gt 单击 清除浏览数据 然而 我仍然得到我的旧图标 知道如何清除该缓存吗 在
  • Android 强制 HDMI 音频

    当我的 ADT 1 连接到电视时 无法通过 HDMI 播放声音 在该特定电视上 我必须在 Raspberry PI 上强制使用 HDMI 音频 因此我也尝试在 ADT 1 上强制使用它 我尝试制作一个具有许可的应用程序
  • Wii 编程教程 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Jackson Mapper 具有特殊字符 é 问题

    你好 我有一个网页 它提交了一个像这样的字符Jos Luis Calleja Garcia 但在服务器中它被转换为Jos Luis Calleja Garcia 我不知道我做错了什么 我应该设置什么配置才能得到它Jos Luis Calle
  • 如何在 Perl 一行中获取当前文件的文件名

    是否可以像下面这样在 Perl 单行代码中获取当前文件名 从文件列表中 perl lane if my value print txt 变量的名称是 ARGV 您可以在以下位置找到相关信息 佩尔瓦尔 ARGV http perldoc pe
  • 为泛型函数专门化一个类型

    鉴于这个定义 declare function foo
  • 如何使用android数据绑定设置SwipeRefreshLayout刷新属性?

    我正在使用 Android 数据绑定库 如果我想让视图可见 我可以这样写
  • CSS:100% 表格的 内的中心文本区域

    现在 我有一个 100 宽度的表格 其中包含 2 列 其中有一个文本区域 用户可以在其中输入文本 table border collapse collapse width 100 border 1px solid black table l
  • 当依赖项被锁定时发现 Composer 软件包的最新版本

    假设我有一个composer json具有锁定依赖项的文件 require zendframework zendframework 2 4 2 require dev phpunit phpunit 4 6 6 我想这样做是因为我想手动更新
  • R - 将向上对角线转换为行

    我得到一个矩阵 数据框或数据表 我想创建一个矩阵 其中向上 反向对角线作为行 其余单元格作为 NA 我能够做到这一点 但我认为 应该有一个更容易 更简单的解决方案 因此 任何解决方案都值得赞赏 作为一个例子 假设我得到以下 data tab
  • Grails 服务类交叉引用

    我意识到 Grails 服务类是 Spring 管理的单例 我还知道 您可以通过像这样的驼峰式大小写形式使用 serviceClassName 声明本地定义来引用另一个服务类 令我惊讶的是 我似乎无法像这样交叉引用服务类 class Fir
  • jsTree:如何从jstree中获取所有叶节点?

    我想从 jsTree 获取所有叶节点 节点的 ID 和文本 我没有使用复选框 ui jsTree Root A A1 A1 1 A2 A2 1 B B2 C C1 C1 1 我想要 jsTree 的叶节点列表 预期输出 A1 1 A2 1
  • Google Drive API 如何支持下载请求的内容范围? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Google Drive API 如何支持获取内容范围请求 App Engine 获取请求大小有限制 请支持范围请求 以便可以读取大文件 您可以提供
  • __unicode__() 不返回字符串

    我在 python 中有以下课程 class myTest def init self str self str str def unicode self return self str 并在其他一些文件中实例化 myTest 来尝试 un
  • Excel 单元格中的 OpenXml 和日期格式

    我正在尝试使用 OpenXML 创建 xlsx 格式的 Excel 文件 因为我需要在 Web 服务器上使用它 我在表格中填写数值没有任何问题 但是我正在努力在单元格中设置经典的日期格式 下面使用快速测试DocumentFormat Ope
  • 类型错误:预期序列或类似数组,得到估计器

    我正在开发一个对产品有用户评论的项目 除了我手动提取的一些其他特征之外 我正在使用 TfidfVectorizer 从数据集中提取特征 df pd read csv reviews csv header 0 FEATURES feature
  • 根据屏幕尺寸缩放字体大小?

    我正在使用 AngularJS 1 x 和 Angular Material 开发一个 Web 应用程序 我正在尝试创建一个带有大标题的登陆页面md display 4 它看起来是这样的 正如您所看到的 标题很好地填充了页面并且适合一行 然
  • 如何在 iOS 地图上叠加一个圆圈

    我有一个半径和一个位置 这就是我试图获取圆的边界矩形的方法 MKMapRect boundingMapRect CLLocationCoordinate2D tmp MKCoordinateSpan radiusSpan MKCoordin
  • Laravel 5.4 - 如何对同一自定义验证规则使用多个错误消息

    为了重用代码 我在名为的文件中创建了自己的验证器规则验证服务提供者 class ValidatorServiceProvider extends ServiceProvider public function boot Validator