РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
593 of 1392 menu

Правило sometimes

Правило sometimes в Laravel позволяет выполнять валидацию полей только при определённых условиях. Оно особенно полезно, когда нужно проверить поле только в том случае, если оно присутствует в запросе, или если выполняется какое-то условие. Правило работает как обёртка над другими правилами и может быть использовано как в массиве правил валидации, так и через метод sometimes у объекта валидатора.

Основное назначение правила sometimes - сделать валидацию гибкой. Например, вы можете проверять поле только тогда, когда оно отправлено клиентом, или только тогда, когда значение другого поля соответствует определённому критерию. Это позволяет избежать ошибок валидации для полей, которые не были отправлены в запросе.

Правило sometimes принимает один или несколько аргументов: имя поля, условие (замыкание или имя другого поля для сравнения), и массив правил валидации. Если условие выполняется и поле присутствует в данных, то применяются указанные правила. Если поле отсутствует, валидация для него не выполняется, даже если условие вернуло true.

Синтаксис

Существует два способа использования правила sometimes:

<?php // Способ 1: через массив правил $rules = [ 'field' => 'sometimes|required|string|max:255', ]; // Способ 2: через метод sometimes валидатора $validator = Validator::make($data, $rules); $validator->sometimes('field', 'required|string', function ($input) { return $input->other_field === 'some_value'; }); ?>

В первом случае правило указывается как строка через вертикальную черту. Во втором случае метод sometimes принимает имя поля, правило или массив правил, и замыкание, которое определяет условие.

Пример использования в массиве правил

Давайте провалидируем запрос, где поле 'nickname' проверяется только в том случае, если оно присутствует в данных:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; class UserController extends Controller { public function update(Request $request) { $data = $request->all(); $rules = [ 'email' => 'required|email', 'nickname' => 'sometimes|string|min:3|max:50', ]; $validator = Validator::make($data, $rules); if ($validator->fails()) { return response()->json($validator->errors(), 422); } return response()->json(['message' => 'Validation passed']); } } ?>

Результат выполнения кода при отправке данных без поля 'nickname':

{"message": "Validation passed"}

Результат выполнения кода при отправке данных с полем 'nickname' длиной 2 символа:

{"nickname": ["The nickname must be at least 3 characters."]}

Пример с условной валидацией через замыкание

Теперь давайте проверим поле 'password' только в том случае, если поле 'change_password' имеет значение 'yes':

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; class SettingsController extends Controller { public function update(Request $request) { $data = $request->all(); $rules = [ 'change_password' => 'required|in:yes,no', 'email' => 'required|email', ]; $validator = Validator::make($data, $rules); $validator->sometimes('password', 'required|string|min:8', function ($input) { return $input->change_password === 'yes'; }); if ($validator->fails()) { return response()->json($validator->errors(), 422); } return response()->json(['message' => 'Settings updated']); } } ?>

Результат выполнения кода при отправке данных с 'change_password' равным 'yes' и отсутствующем поле 'password':

{"password": ["The password field is required."]}

Результат выполнения кода при отправке данных с 'change_password' равным 'no' и отсутствующем поле 'password':

{"message": "Settings updated"}

Обратите внимание: в первом случае валидация поля 'password' выполняется, а во втором - пропускается.

Пример с использованием FormRequest

Правило sometimes также можно использовать в классах FormRequest. Для этого переопределите метод rules и добавьте условие:

<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Contracts\Validation\Validator; use Illuminate\Http\Exceptions\HttpResponseException; class UserUpdateRequest extends FormRequest { public function authorize() { return true; } public function rules() { $rules = [ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email,' . $this->user()->id, ]; return $rules; } public function getValidatorInstance() { $validator = parent::getValidatorInstance(); $validator->sometimes('phone', 'required|string|min:10', function ($input) { return $input->has_phone === 'yes'; }); return $validator; } } ?>

В этом примере поле 'phone' проверяется только если поле 'has_phone' равно 'yes'. Метод getValidatorInstance позволяет добавить условные правила до выполнения валидации.

Смотрите также

  • правило required,
    которое делает поле обязательным для заполнения
  • правило nullable,
    которое позволяет полю иметь значение null
  • правило filled,
    которое требует, чтобы поле было заполнено, если оно присутствует
  • правило present,
    которое требует наличия поля в данных, даже если оно пустое
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить