【问题标题】:Respect validation multiple custom error messages尊重验证多个自定义错误消息
【发布时间】:2013-02-27 09:51:35
【问题描述】:

如何使用Respect Validation 获得多个自定义错误消息。

我有一些输入要针对多个验证器进行验证。而且我希望每次验证都有一个自定义错误消息。

这是我尝试过的:

try {
    Respect\Validation\Validator::create()
        ->key('foo',
            v::length(20)->setName('bar')->setTemplate('Custom length message.')
             ->alnum()->setName('baz')->setTemplate('Custom alnum message.')
        )
        ->assert([
            'foo' => 'Hello, world!',
        ]);
} catch (Respect\Validation\Exceptions\ValidationException $exception) {
    $errors = $exception->findMessages([
        'bar',
        'baz',
    ]);
    var_dump($errors);
}

输出是:

array (size=2)
  'bar' => string '' (length=0)
  'baz' => string 'Custom alnum message.' (length=21)

我希望它输出两个自定义错误消息。

理想情况下,我可以为 1 个输入获得一组消息,例如:

var_dump($exception->findMessages(['foo']));

会给我:

array (size=1)
  'foo' => 
    array (size=2)
      0 => string 'Custom length message.' (length=22)
      1 => string 'Custom alnum message.' (length=21)

这个问题看起来像风滚草。

【问题讨论】:

  • 1.愚蠢的问题,但是您的 Respect 构建了多少年,因为看起来一年左右的 setTemplate() 函数存在错误,“创建异常时,它会检查模板是否存在,但是它返回为空“github.com/Respect/Validation/issues/64。 2. 我找不到这个函数的任何 docco,它是否打算作为公共 API 的一部分(因此,你知道这个 应该 是否像你期望的那样工作)吗? 3. 你尝试过不同的验证器组合吗?例如,它总是只有最后一个添加它的消息吗?
  • 4.只是出于兴趣,您是否根据 docco 中的Informative Excpetions 从getFullMessage(); 获得预期输出?这至少可以提供一个线索,说明是消息在异常丢失,还是只是输出异常的错误。
  • @Sepster 1. 我正在使用最新的 dev-master。 2. 我通过查看代码找到了该函数,它是一个公共方法,因此可以假定它是公共 API 的一部分。 3. 是的,它似乎总是链中的最后一个验证者。 4.getFullMessage()输出默认消息而不是自定义消息。

标签: php validation respect-validation


【解决方案1】:

您不能将它们链接在一起并获取自定义消息,因为您调用的最后一条自定义消息将简单地分配给规则集,而不是由于链接的实现而分配给单独的规则。

为了演示这一点,我从 git 克隆了它,创建了一个 bin 目录,并用这个 test.php 稍微修改了你的示例

<?php
set_include_path(implode(PATH_SEPARATOR, array(
  realpath('../library')
)));

function __autoload($class_name) {
    include $class_name . '.php';
}

use Respect\Validation\Validator as v;

try {
    $chained = Respect\Validation\Validator::create()
        ->key('foo',
            v::length(20)->setName('bar')->setTemplate('Custom length message.')
             ->alnum()->setName('baz')->setTemplate('Custom alnum message.')
        );

    print_r($chained);

    $chained->assert(array(
            'foo' => 'Hello, world!',
        ));

} catch (Respect\Validation\Exceptions\ValidationException $exception) {
    $errors = $exception->findMessages(array(
        'bar',
        'baz',
    ));
    var_dump($errors);
}

the print_r($chained) shows us:

Respect\Validation\Validator Object
(
    [rules:protected] => Array
        (
            [00000000791c0e000000000030f3f15e] => Respect\Validation\Rules\Key Object
                (
                    [mandatory] => 1
                    [reference] => foo
                    [validator] => Respect\Validation\Validator Object
                        (
                            [rules:protected] => Array
                                (
                                    [00000000791c0e030000000030f3f15e] => Respect\Validation\Rules\Length Object
                                        (
                                            [minValue] => 20
                                            [maxValue] =>
                                            [inclusive] => 1
                                            [name:protected] =>
                                            [template:protected] =>
                                        )

                                    [00000000791c0e020000000030f3f15e] => Respect\Validation\Rules\Alnum Object
                                        (
                                            [additionalChars] =>
                                            [stringFormat] => /^(\s|[a-zA-Z0-9])*$/
                                            [name:protected] =>
                                            [template:protected] =>
                                        )

                                )

                            [name:protected] => baz
                            [template:protected] => Custom alnum message.
                        )

                    [name:protected] => foo
                    [template:protected] =>
                )

        )

    [name:protected] =>
    [template:protected] =>
)

您可能会注意到,规则集获取了姓氏和传入的最后一个模板,而实际的验证对象都没有获得名称或模板。我在图书馆里看不到任何真正做你想做的事情的方法。

所以我决定另辟蹊径。在我的 ../bin 目录中,我创建了这个类,扩展了 Valditor 类。

<?php
use Respect\Validation\Validator as v;
class BubbaValidator extends v {

    public function getRuleset($rulename = null){
        if (is_null($rulename)) return $this->rules;
        foreach ($this->rules as $rule){
            if ($rule->getName() == $rulename){
                return $rule;
            }
        }
    }

    public function getValidatorRules($rulesetName, $ruleType=null){
        $ruleset = $this->getRuleset($rulesetName);
        $validators = $ruleset->validator;

        if (is_null($ruleType)){
            return $validators;
        }

        foreach ($validators->rules as $key=>$validator){
            if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){
                $validator->name = "bar";
                $validator->template = "bubba rocks";
                $validators->rules[$key]->name = "bar";
                $validators->rules[$key]->template = "bubba rocks";
                return $validator;
            }
        }
    }

    public function setValidatorRuleName($rulesetName, $ruleType, $name){
        $ruleset = $this->getRuleset($rulesetName);
        $validators = $ruleset->validator;
        foreach ($validators->rules as $key=>$validator){
            if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){
                $validators->rules[$key]->name = $name;
                return $validator;
            }
        }
    }

    public function setValidatorRuleTemplate($rulesetName, $ruleType, $template){
        $ruleset = $this->getRuleset($rulesetName);
        $validators = $ruleset->validator;
        foreach ($validators->rules as $key=>$validator){
            if (get_class($validator) === 'Respect\Validation\Rules\\'.$ruleType){
                $validators->rules[$key]->template = $template;
                return $validator;
            }
        }
    }

}

然后我修改了脚本并运行了它

<?php
set_include_path(implode(PATH_SEPARATOR, array(
  realpath('../library'),
  realpath(__DIR__)
)));

function __autoload($class_name) {
    include $class_name . '.php';
}

use BubbaValidator as v;

try {
    $chained = new BubbaValidator();
    $chained->key('foo',
            v::length(20)->setName('bar')->setTemplate('Custom length message.')
             ->alnum()->setName('baz')->setTemplate('Custom alnum message.')
        );

    $chained->setValidatorRuleName('foo', 'Alnum', 'baz');
    $chained->setValidatorRuleTemplate('foo', 'Alnum', 'Bubba\'s Custom Alnum!');
    $chained->setValidatorRuleName('foo', 'Length', 'bar');
    $chained->setValidatorRuleTemplate('foo', 'Length', 'Bubba\'s Custom Length!');

    $chained->assert(array(
            'foo' => 'Hello, world!',
        ));

} catch (Respect\Validation\Exceptions\ValidationException $exception) {
    $errors = $exception->findMessages(array(
        'bar',
        'baz',
    ));
    var_dump($errors);
}

最终得到这个输出:

  D:\Users\Bubba\git\Validation\bin>php test.php 
  array(2) {
    ["bar"]=> 
   string(22) "Bubba's Custom Length!" 
    ["baz"]=>   
    string(21) "Custom alnum message." }

这很有趣!

【讨论】:

    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2011-10-12
    相关资源
    最近更新 更多