Поскольку заголовок вопроса гласит: Как вы можете получить доступ к другим входным атрибутам при использовании Validator :: extend?
При проверке встроенного класса валидатора Laravel я вижу, что он использует $this->data
для доступа к другим атрибутам; однако вы не можете напрямую использовать $this
в закрытии, которое требуется Validator :: extend.
Кажется, что ручное расширение класса Validator (через пользовательский класс) является единственным вариантом … Правильно ли я? Если это так, мне кажется серьезным ограничением для преобразования валидаторов в пакеты, поскольку каждый пакет расширяет базовый класс Validator, для которого PHP в конечном итоге просто сохранит последнее определенное расширение (и, таким образом, сделает другие пакеты проверки достоверности непригодными …). Или я чего-то не хватает?
Благодарю.
РЕДАКТИРОВАТЬ
Я также попытался завершить его в пакете, следуя этому методу Джейсоном Льюисом, но я продолжаю получать BadMethodCallException
заявляя, что метод проверки не может быть найден … Пакет совместим с psr-0, и я уверен, что это не проблема с именами.
После небольшого тестирования вы можете получить доступ к массиву, если используете класс, а не обратный вызов. Поскольку он расширяет класс 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', 'TestRulesValidator@validateTestRule');