簡體   English   中英

如何在Zend \\ Form中自定義正則表達式驗證消息以使其可重復使用?

[英]How to customise the Regex validation messages in a Zend\Form keeping them reusable?

正則Regex的默認驗證錯誤消息是

"The input does not match against pattern '%pattern%'"

我可以用一個自定義的替代它

"Please make an input according to the pattern '%pattern%'"

但是隨后,我仍然收到一個帶有內部正則表達式的不太友好的消息。 我也可以寫

"Only capital letters are allowed"

但是在這種情況下,我需要為每個正則表達式字段編寫一條新消息。

是否可能/如何創建自己的但仍然靈活/可重用/可參數化的消息?


我想要的一個例子:

public function getInputFilterSpecification()
{
    return [
        'foo' => [
            'validators' => [
                [
                    'name' => 'Regex',
                    'options' => [
                        'pattern' => '/^[A-Z0-9:]*$/',
                        'pattern_user_friendly' => 'capital letters, numbers, and colons',
                        'message' => 'The input may only contain the following characters: %pattern_user_friendly%.'
                    ]
                ],
            ]
        ],
        'bar' => [
            'validators' => [
                [
                    'name' => 'Regex',
                    'options' => [
                        // new pattern
                        'pattern' => '/^[A-Z~:\\\\]*$/',
                        // new user friendly pattern description
                        'pattern_user_friendly' => 'capital letters, tildes, colons, and backslashes',
                        // still the same message
                        'message' => 'The input may only contain the following characters: %pattern_user_friendly%.'
                    ]
                ],
            ]
        ],
    ];
}

解決方案是創建一個自定義的Validator (擴展Regex ),在其中擴展messageVariables列表,並添加用於將值設置為屬性的邏輯:

class Regex extends ZendRegex
{
    protected $patternUserFriendly;

    public function __construct($pattern)
    {
        // s. https://github.com/zendframework/zend-validator/blob/master/src/Regex.php#L34-L36
        $this->messageVariables['patternUserFriendly'] = 'patternUserFriendly';
        $this->messageTemplates[self::NOT_MATCH] =
            'The input may only contain the following characters: %patternUserFriendly%.'
        ;
        parent::__construct($pattern);
        if (array_key_exists('patternUserFriendly', $pattern)) {
            $this->patternUserFriendly = $pattern['patternUserFriendly'];
        }
    }
}

class MyFieldset extends ZendFieldset implements InputFilterProviderInterface
{
    ...
    public function init()
    {
        parent::init();
        $this->add(
            [
                'type' => 'text',
                'name' => 'foo',
                'options' => [
                    'label' => _('foo')
                ]
            ]);
        $this->add(
            [
                'type' => 'text',
                'name' => 'bar',
                'options' => [
                    'label' => _('bar')
                ]
            ]);
    }
    public function getInputFilterSpecification()
    {
        return [
            'bar' => [
                'validators' => [
                    [
                        'name' => 'MyNamespace\Validator\Regex',
                        'options' => [
                            'pattern' => '/^[a-zA-z]*$/',
                            'patternUserFriendly' => '"a-z", "A-Z"'
                        ]
                    ]
                ]
            ]
        ];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM