Правила проверки Laravel 5.7

Когда я отправляю форму, это то, что я делаю, чтобы проверить свои поля...

<?php

$this->validate($request, [
    'name' => __('required|max:255|unique:templates,name,NULL,id,company_id,:company_id', [
        'company_id' => $request->input('companies')
    ]),
    'modules' => 'required|numeric',
    'companies' => 'required|numeric',
    'start_date' => 'required_with:limited_availability|date|before:end_date',
    'end_date' => 'required_with:limited_availability|date|after:start_date',
    'indesign_location' => __('required|file|mimetypes:application/zip|max::max_upload_size', [
        'max_upload_size' => config('file.max_size')
    ])
]);

Чего я хочу добиться: поля start_date и end_date должны быть обязательными (и, следовательно, проверяться) только при наличии поля limited_availability.

Что происходит сейчас: я не получаю сообщения о том, что поле является обязательным, но я получаю сообщение об ошибке в обоих полях даты, что указанная дата недействительна.

limited_availability — это флажок, а start_date и end_date — поля ввода даты.

Как я могу решить эту проблему?


person Community    schedule 31.10.2018    source источник
comment
Можете ли вы сбросить представленное значение limited_availability. На самом деле не уверен, как работает проверка required_with, но если значение limited_availability всегда отправляется, оно всегда будет проходить правило проверки.   -  person Dharma Saputra    schedule 31.10.2018
comment
Что происходит сейчас, так это то, что я не получаю сообщение о том, что поле обязательно, но я получаю сообщение об ошибке в обоих полях даты, что указанная дата недействительна. Если поля даты присутствуют, то это не требует проверки. Проверка, так что в этом нет ошибки? Если вы пробовали без одного параметра даты, и он говорит так, то он в основном не видит limited_availability как присутствующего. Вы уверены, что отправляете их? Проверьте переменную $request, чтобы узнать, существует ли она.   -  person mutas    schedule 31.10.2018
comment
@DharmaSaputra Я на 100% уверен, что поля limited_availability нет в сообщении. Я проверил это. То есть, когда я не ставлю галку, когда я ее устанавливаю, она присутствует в запросе.   -  person    schedule 31.10.2018
comment
@mutas limited_availability не отправляется, если я не установил флажок (см. мой комментарий выше). Моя цель - сделать поле обязательным и проверять дату только при проверке limited_availability.   -  person    schedule 31.10.2018
comment
У меня больше нет идей. Но я бы проверил запрос с помощью dd($request-›all());, return $request-›all(); или с помощью инструментов отладки, когда я установил флажок, а не нет.   -  person mutas    schedule 31.10.2018


Ответы (2)


Может быть, это наивное решение. Но я уверен, что это сработает.

// First thing we separate the validation rule and save it in a variable
$rules = [
    'name'                 => __( 'required|max:255|unique:templates,name,NULL,id,company_id,:company_id', [
        'company_id' => $request->input( 'companies' )
    ] ),
    'modules'              => 'required|numeric',
    'companies'            => 'required|numeric',
    'indesign_location'    => __( 'required|file|mimetypes:application/zip|max::max_upload_size', [
        'max_upload_size' => config( 'file.max_size' )
    ] )
];

// the solution is here
if ($request->has('limited_availability')) {
    $rules['start_date'] = 'required|date|before:end_date';
    $rules['end_date']   = 'require|date|after:start_date';
}

$this->validate( $request, $rules);

Надеюсь, поможет.

person Dharma Saputra    schedule 31.10.2018
comment
Оно делает. Но я как бы надеялся, что это возможно в одной строке без каких-либо других операторов if/else. Похоже, это лучшее решение. - person ; 31.10.2018

Вы можете добиться этого, используя любое из этих правил проверки. Поставьте запятую и она будет считаться вторым параметром.

'start_date' => 'required_if:limited_availability,'
'end_date' => 'required_if:limited_availability,' 

or

 'start_date' => 'required_without:limited_availability,'
 'end_date' => 'required_without:limited_availability,'
person DPS    schedule 31.10.2018
comment
Спасибо, но required_if требует 2 параметра, так что должно быть required_if:limited_availability,1, если я прав. Когда я пытаюсь это сделать, я все еще получаю сообщение о том, что указанная дата недействительна. - person ; 31.10.2018