Несколько правил/сообщений об ошибках внутри пользовательского правила в 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;
    }
}

Как я могу определить пользовательское сообщение об ошибке внутри CheckFooException, если срабатывает (strlen($input) != 3)?


person IMB    schedule 18.11.2018    source источник


Ответы (1)


Проверка используемой вами библиотеки, особенно ValidationException и реализацию для AttributeException должна быть возможность доступа к свойству, объявленному в вашем классе правил, во время проверки через ValidationException::getParam($propertyName) из вашего класса исключений. Вот так:

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;

    }
}

Затем получите к нему доступ, реализуя/переопределяя метод 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 разных правила с выделенными сообщениями (или, для чего-то тривиального по длине, использовать тот, который уже предоставлен библиотекой).

person macghriogair    schedule 18.11.2018
comment
Спасибо! Я также обнаружил, что вы также можете использовать $this->setTemplate('your message'); перед любым return false. - person IMB; 19.11.2018