Как получить доступ к другим входным атрибутам в Validator:: extend?

Как говорится в заголовке вопроса: Как вы можете получить доступ к другим входным атрибутам при использовании Validator:: extend?

При проверке встроенного класса валидатора Laravel я вижу, что он использует $this->data для доступа к другим атрибутам; однако вы не можете напрямую использовать $this в закрытии, которое требуется для проверки Validator:: extend.

Кажется, что ручное расширение класса Validator (через пользовательский класс) является единственным вариантом... Правильно ли? Если это так, мне кажется серьезным ограничением для преобразования валидаторов в пакеты, поскольку каждый пакет расширяет базовый класс Validator, для которого PHP в конечном итоге просто сохранит последнее определенное расширение (и, таким образом, сделает другие пакеты проверки достоверности непригодными...). Или я что-то упускаю?

Спасибо.

ИЗМЕНИТЬ

Я также попытался завершить его в пакете после этого метода Джейсона Льюиса, но я продолжаю получать BadMethodCallException, заявляя, что метод проверки не найден... Пакет совместим с psr-0, и я уверен, что это не проблема с именами.

Ответы

Ответ 1

После небольшого тестирования вы можете получить доступ к массиву, если используете класс, а не обратный вызов. Поскольку он расширяет класс Validator.

class TestRulesValidator extends \Illuminate\Validation\Validator
{

    public function validateTestRule($attribute, $value, $parameters)
    {
        var_dump($this->data);

        exit();
    }

}

В документации проверки используйте:

Validator::resolver(function($translator, $data, $rules, $messages) {
    return new TestRulesValidator($translator, $data, $rules, $messages);
});

Ваше имя правила будет test_rule. Удалите ключевое слово validate и преобразуйте в регистр подчеркивания.

Просто протестируйте это на новой установке, и он работает.

Изменить. Вы также можете использовать обычный метод extend и передать дополнительный параметр.

class TestRulesValidator
{

    public function validateTestRule($attribute, $value, $params, $validator) {
        var_dump($validator->getData());
    }

}

Validator::extend('test_rule', '[email protected]');