Сегодня я хочу поговорить о том, как избавиться от дублирования кода в Laravel, особенно в тех местах, где это совсем не бросается в глаза — в валидации запросов.
✋ Проблема
У тебя есть формы на создание и обновление сущности. И в обоих случаях в контроллере или Form Request’ах ты пишешь одинаковые правила валидации, только с небольшими отличиями.
Пример:
// StorePostRequest.php
return [
'title' => 'required|string|max:255',
'content' => 'required',
];
// UpdatePostRequest.php
return [
'title' => 'sometimes|required|string|max:255',
'content' => 'sometimes|required',
];
✅ Решение — базовый класс с общими правилами
Создай абстрактный класс с общими правилами:
abstract class BasePostRequest extends FormRequest
{
protected function commonRules(): array
{
return [
'title' => 'string|max:255',
'content' => 'string',
];
}
}
А потом в наследниках добавляй нужные модификаторы:
// StorePostRequest.php
class StorePostRequest extends BasePostRequest
{
public function rules(): array
{
return array_merge([
'title' => 'required',
'content' => 'required',
], $this->commonRules());
}
}
// UpdatePostRequest.php
class UpdatePostRequest extends BasePostRequest
{
public function rules(): array
{
return array_merge([
'title' => 'sometimes|required',
'content' => 'sometimes|required',
], $this->commonRules());
}
}
🤔 Альтернатива — кастомная Rule-комбинация
Можно пойти дальше и использовать кастомные Rule-классы, если валидация становится сложной и завязанной на бизнес-логику.
Я часто вижу дублирование в валидации, особенно в старых проектах. Убрав это, код становится чище, а изменения в правилах — в разы проще.
А ты как организуешь валидацию? Используешь Form Request или валидируешь прямо в контроллере?
👉 @php_lib
>>Click here to continue<<