Respect\Validation 中的自定义规则内有多个 rules/error 消息?
Multiple rules/error messages inside a custom rule in Respect\Validation?
假设您有这样的自定义规则:
<?php
class CheckFoo extends \Respect\Validation\Rules\AbstractRule
{
public function validate($input)
{
if ($input == 'foo')
return true;
else
return false;
}
}
class CheckFooException extends \Respect\Validation\Exceptions\ValidationException
{
public static $defaultTemplates = [
self::MODE_DEFAULT => [
self::STANDARD => '{{name}} must be foo',
],
self::MODE_NEGATIVE => [
self::STANDARD => '{{name}} must not be foo',
],
];
}
这很好用,但是否可以在此规则中添加其他规则?为了说明,是否可能是这样的:
class CheckFoo extends \Respect\Validation\Rules\AbstractRule
{
public function validate($input)
{
if (strlen($input) != 3)
return false;
if ($input == 'foo')
return true;
else
return false;
}
}
如果 (strlen($input) != 3)
被触发,我如何在 CheckFooException
中定义自定义错误消息?
检查您正在使用的库,尤其是 ValidationException class 和 AttributeException
的实现,应该可以访问在您的规则中声明的 属性 class 在验证过程中通过 ValidationException::getParam($propertyName)
来自您的异常 class。像这样:
class CheckFoo extends \Respect\Validation\Rules\AbstractRule
{
public $reason;
public function validate($input)
{
if (strlen($input) != 3) {
$this->reason = 'length';
return false;
}
if ($input !== 'foo') {
$this->reason = 'content';
return false;
}
return true;
}
}
然后访问implementing/overriding方法ValidationException::chooseTemplate
,像这样:
class CheckFooException extends \Respect\Validation\Exceptions\ValidationException
{
const INVALID_LENGTH = 0;
const INVALID_NAME = 1;
public static $defaultTemplates = [
self::MODE_DEFAULT => [
self::INVALID_NAME => '{{name}} must be foo',
self::INVALID_LENGTH => '{{name}} must be 3 characters long',
],
self::MODE_NEGATIVE => [
self::INVALID_NAME => '{{name}} must not be foo',
self::INVALID_LENGTH => '{{name}} must not be 3 characters long',
],
];
public function chooseTemplate()
{
return 'length' === $this->getParam('reason')
? self::INVALID_LENGTH
: self::INVALID_NAME;
}
}
测试:
v::checkFoo()->check('FOO'); // => "FOO" must be foo
v::checkFoo()->check('foox'); // => "foox" must be 3 characters long
或者,您可以将 2 种不同的规则与专用消息结合使用(或者,对于长度不重要的某物,使用库已经提供的规则)。
假设您有这样的自定义规则:
<?php
class CheckFoo extends \Respect\Validation\Rules\AbstractRule
{
public function validate($input)
{
if ($input == 'foo')
return true;
else
return false;
}
}
class CheckFooException extends \Respect\Validation\Exceptions\ValidationException
{
public static $defaultTemplates = [
self::MODE_DEFAULT => [
self::STANDARD => '{{name}} must be foo',
],
self::MODE_NEGATIVE => [
self::STANDARD => '{{name}} must not be foo',
],
];
}
这很好用,但是否可以在此规则中添加其他规则?为了说明,是否可能是这样的:
class CheckFoo extends \Respect\Validation\Rules\AbstractRule
{
public function validate($input)
{
if (strlen($input) != 3)
return false;
if ($input == 'foo')
return true;
else
return false;
}
}
如果 (strlen($input) != 3)
被触发,我如何在 CheckFooException
中定义自定义错误消息?
检查您正在使用的库,尤其是 ValidationException class 和 AttributeException
的实现,应该可以访问在您的规则中声明的 属性 class 在验证过程中通过 ValidationException::getParam($propertyName)
来自您的异常 class。像这样:
class CheckFoo extends \Respect\Validation\Rules\AbstractRule
{
public $reason;
public function validate($input)
{
if (strlen($input) != 3) {
$this->reason = 'length';
return false;
}
if ($input !== 'foo') {
$this->reason = 'content';
return false;
}
return true;
}
}
然后访问implementing/overriding方法ValidationException::chooseTemplate
,像这样:
class CheckFooException extends \Respect\Validation\Exceptions\ValidationException
{
const INVALID_LENGTH = 0;
const INVALID_NAME = 1;
public static $defaultTemplates = [
self::MODE_DEFAULT => [
self::INVALID_NAME => '{{name}} must be foo',
self::INVALID_LENGTH => '{{name}} must be 3 characters long',
],
self::MODE_NEGATIVE => [
self::INVALID_NAME => '{{name}} must not be foo',
self::INVALID_LENGTH => '{{name}} must not be 3 characters long',
],
];
public function chooseTemplate()
{
return 'length' === $this->getParam('reason')
? self::INVALID_LENGTH
: self::INVALID_NAME;
}
}
测试:
v::checkFoo()->check('FOO'); // => "FOO" must be foo
v::checkFoo()->check('foox'); // => "foox" must be 3 characters long
或者,您可以将 2 种不同的规则与专用消息结合使用(或者,对于长度不重要的某物,使用库已经提供的规则)。