В соответствии с документацией валидации laravel :
required_with_all: foo, bar, … Поле под проверкой должно присутствовать только в том случае, если присутствуют все остальные указанные поля.
- ErrorBag всегда пуст в Laravel 5.2
- Как предотвратить вставку электронной почты, если она уже существует с определенным идентификатором в laravel?
- Laravel Назад на страницу со старым вводом для проверки
- Как заставить FormRequest возвратить json в Laravel 5.1?
- Правила валидации Laravel, если значение существует в другом массиве полей
Вот мой тест:
Route::get('/test/{param}', function($param) { $screenRules = array( 'foo' => 'string', 'param' => 'required_with_all:foo', ); $validator = Validator::make(array('param' => $param), $screenRules); if($validator->fails()) { echo '<pre>'; print_r($validator->errors()); echo '</pre>'; die('Dying now!'); } else { echo 'All Good!'; die('Dying now!'); } });
Я бы ожидал, что, поскольку я не пропущу foo
, этот тест должен потерпеть неудачу. Но этот тест проходит, когда я вызываю свой url: mysite.com/test/mytest
Аналогично, если вы отмените эту роль,
'param' => 'required_without_all:foo',
и передать foo в качестве входных данных
array('param' => $param, 'foo' => 'bar')
Я ожидал бы, что, поскольку foo
присутствует, у вас не может быть param
. Но тест все же проходит.
В обоих случаях я должен видеть ошибки. и так, что здесь происходит?
Я также знаю, что мои функции проверки не ошибаются, потому что работает моя другая проверка. Например, добавьте условие:
'param' => 'required_with_all:foo|numeric',
и он обязательно вызывает ошибку. The param must be a number.
Наконец я понял ответ. Я неправильно понял всю концепцию required_if
. Этот ответ поможет любому, кто когда-либо застрял здесь. Ключ читает документацию laravel снова и снова;)
Для required_with_all
он говорит: Поле под проверкой должно присутствовать только в том случае, если присутствуют все другие указанные поля.
Например, param => required_with_all:foo,bar,...
означает, что при foo и bar оба присутствуют, а param
отсутствует, тогда произойдет ошибка проверки.
Я неправильно понял его так, что, если param
есть, значит для него требуется foo
и bar
. Это наоборот, хотя мы только что видели.
Если вам нужно сделать валидацию, как if param is present, foo must be present
используя правило valid_with validation на foo, например:
'param' => 'required_with:foo', 'foo' => 'required_with: param
Это гарантирует, что если foo
или param
, любой из них присутствует, они потребуют присутствия другого.
Первый тестовый пример
'param' => 'required_with_all:foo'
и я передал следующий ввод
array('param' => $param)
Не удалось выполнить тестовый сценарий, потому что foo не был на входе, не вызвал проверку, потому что правило говорит только о проверке, когда присутствует foo
. Поэтому вместо того, чтобы передавать param
качестве входных данных, просто передайте foo
качестве ввода, и вы увидите ошибку, требуемую параметром, когда присутствует foo
.
Второй тестовый пример
'param' => 'required_without_all:foo',
и пропуская вход так:
array('param' => $param, 'foo' => 'bar')
Эта проверка не сработала, потому что она говорит, что параметр необходим только тогда, когда foo
отсутствует. Однако, на моем входе я прошел foo. Удалите оба параметра foo
и param
и вы увидите ошибку, которая, если foo отсутствует, требуется параметр.
Как глупо со мной!