Проверка Laravel: обязательное условие обязательно_with_all

В соответствии с документацией валидации laravel :

required_with_all: foo, bar, … Поле под проверкой должно присутствовать только в том случае, если присутствуют все остальные указанные поля.

Вот мой тест:

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 отсутствует, требуется параметр.

Как глупо со мной!