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).
  • Вспомогательные штуки, которые реально переиспользуются в нескольких местах, а не только "потому что мне лень копипастить два раза".

Вывод

Трейты — это костыль. Но иногда хороший костыль лучше, чем тонны копипаста. Пользуйся ими, когда реально нужно повторное использование, а не ради того, чтобы казаться "архитектором".