Laravel и так завален сахаром, а трейты — это ещё одна посыпка сверху. В доках их подают как "мощный и гибкий способ переиспользования кода". На деле это тупо PHP-механизм: сделал набор методов, сунул в трейт, потом заюзал use TraitName; в классе.
Если делаешь с умом — код становится чище. Если начинаешь лепить трейт на каждый чих — через полгода у тебя ад, где половина методов живёт в трейтах, половина в моделях, а найти что-то сложнее, чем нормального пхп-разработчика.
Как создать трейт
Laravel даже под это сделал генератор:
php artisan make:trait HasTimestamps
Да, Artisan теперь умеет клепать даже такие штуки. После команды получаешь файл в app/Traits.
Пример
Допустим, у тебя стандартные поля created_at и updated_at. Ты хочешь красиво форматировать их под d/m/Y. В трейте это будет так:
namespace App\Traits;
trait HasTimestamps
{
public function getCreatedAtAttribute($value)
{
return \Carbon\Carbon::parse($value)->format('d/m/Y');
}
public function getUpdatedAtAttribute($value)
{
return \Carbon\Carbon::parse($value)->format('d/m/Y');
}
}
Как юзать
Просто добавляешь в класс:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Traits\HasTimestamps;
class Post extends Model
{
use HasTimestamps;
}
Всё, теперь модель Post всегда возвращает даты в нормальном формате, и не надо каждый раз писать эту логику заново.
Трейты в контроллерах
Можно и в контроллер закинуть. Допустим, у тебя куча однотипных вспомогательных методов, и ты не хочешь их копипастить.
namespace App\Http\Controllers;
use App\Traits\HasTimestamps;
class PostController extends Controller
{
use HasTimestamps;
// тут твои методы
}
Да, это будет работать, но тут начинается самое интересное.
Подводные камни
- Лёгкий путь в ад. Когда всё подряд пихают в трейты, проект превращается в помойку. Ты открываешь модель, видишь кучу трейтов, а внутри вообще непонятно, какие методы она реально имеет.
- Конфликты. Два трейта определили один и тот же метод? Поздравляю, PHP пошлёт тебя на хер с ошибкой "trait method collision".
- Лень вместо архитектуры. Иногда трейт юзают вместо нормального сервиса. Потому что "так проще". Через полгода ты уже не понимаешь, почему логика авторизации лежит в трейте, а не в отдельном классе.
Когда трейты реально нужны
- Повторяющаяся логика в моделях (
timestamps,slugs,scopes). - Общие хелперы в контроллерах (например, метод для ответа JSON).
- Вспомогательные штуки, которые реально переиспользуются в нескольких местах, а не только "потому что мне лень копипастить два раза".
Вывод
Трейты — это костыль. Но иногда хороший костыль лучше, чем тонны копипаста. Пользуйся ими, когда реально нужно повторное использование, а не ради того, чтобы казаться "архитектором".
0 комментариев