Laravel 5.1中的自定义验证替代者

4

我正在尝试在我的Laravel 5.1应用程序中创建自定义验证替换器。

目前我有以下代码:

Validator::replacer('year', 'App\CustomValidators@replaceYear');

在我的AppServiceProvider文件中,我有一个对应的函数存在于我的自定义类中。然而,当我在验证信息中包含:year时,它没有被替换。我错过了什么吗?
这是我的替换函数。
public function replaceYear($message, $attribute, $rule, $parameters)
{
    return str_replace([':year'], $parameters, $message);
}
1个回答

12

我真正应该做的是设置我的替换器类似于这样:

Validator::replacer('dateInYear', 'App\CustomValidators@replaceDateInYear');

dateInYear名称对应着我设置的自定义验证规则的名称。不过,最终我所采取的方法是扩展验证器类,这样我就不必再声明每个自定义规则和替换器了。我的验证器类现在看起来大致如下:

<?php

namespace App\Services;

use Carbon\Carbon;
use \Illuminate\Validation\Validator;

class CustomValidator extends Validator
{

    /**
     * The new validation rule I want to apply to a field. In this instance,
     * I want to check if a submitted date is within a specific year
     */
    protected function validateDateInYear($attribute, $value, $parameters, $validator)
    {
        $date = Carbon::createFromFormat('m/d/Y', $value)->startOfDay();

        if ($date->year == $parameters[0]) {
            return true;
        }
        return false;
    }

    //Custom Replacers
    /**
     * The replacer that goes with my specific custom validator. They
     * should be named the same with a different prefix word so laravel
     * knows they should be run together.
     */
    protected function replaceDateInYear($message, $attribute, $rule, $parameters)
    {
        //All custom placeholders that live in the message for
        //this rule should live in the first parameter of str_replace
        return str_replace([':year'], $parameters, $message);
    }
}

这让我大部分时间可以不用更改我的AppServiceProvider文件,只需要在任何服务提供者中注册新的验证类。

Laravel文档对于替换器需要做什么的解释非常缺乏,所以我希望这能帮助到日后的某个人。


在这里继承Laravel的验证器有什么目的呢?你似乎没有访问任何内部受保护的方法或成员变量,所以这有点多余。除此之外...你做得很好!点个赞:D - aefxx
谢谢,你的评论帮了我很大的忙!不过我遇到了一个错误,后来在另一个问题中解决了。它指出你不应该在自定义类中扩展Validator,因为这会破坏一些东西。 - Tjab
这个答案让我找到了正确的方向。我在验证函数内部调用了替换器,像这样:$validator->addReplacer('dateInYear', 'App\Services\CustomValidator@replaceDateInYear'); - ironic_ollins
在 Laravel 8.x 中似乎仍然无法正常工作,因为您不能再轻松地注册验证器了(现在使用工厂)。 - Toskan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接