Розширюємо класи Laravel методом orAbort за допомогою трейту
Іноді в Laravel ми пишемо однаковий шаблон: намагаємося отримати модель або одразу зупиняємо виконання з потрібним HTTP-кодом. Це працює, але код стає менш читабельним, а логіка розкидається по всьому проєкту. Вихід — винести повторюваний патерн у невеликий, акуратний трейт.
Вдохновившись підходом з Edd Man’s про опціональні управляючі потоки, я створив невеликий пакет для Laravel, який реалізує опціональну зупинку застосунку. Його ідея проста: якщо метод повернув «нічого» (наприклад, false), викликаємо abort() з потрібним статусом.
Пакет доступний на GitHub: spatie/laravel-or-abort. Він надає трейт SpatieOrAbortOrAbort, який можна підключити до будь-якого класу. Після підключення всі методи класу отримують додаткову поведінку: до них додається можливість викликати orAbort.
Навіщо це потрібно: прибираємо повторювані конструкції
Зазвичай ми робимо таке:
$article = $articleRepository->find($articleId) ?: abort(404);
Це коротко, але при масштабуванні проєкту такі вирази починають повторюватися в багатьох місцях. Крім того, логіка «якщо не знайдено — зупини» стає менш очевидною для читача.
З трейтом orAbort той самий сценарій перетворюється на читабельний виклик:
$article = $articleRepository->findOrAbort($articleId);
Тепер чітко видно намір: ми шукаємо, а якщо результату немає — одразу зупиняємо застосунок.
Як задати власний HTTP-код
За замовчуванням використовується код 404. Але інколи потрібно зупинити застосунок з іншим статусом — наприклад, 500 або 403. Для цього достатньо передати другий параметр:
$article = $articleRepository->findOrAbort($articleId, 500);
Якщо метод репозиторію поверне false, Laravel зупинить виконання через abort(500).
Підключення пакета та приклад використання
Щоб почати, встановіть пакет через Composer:
composer require spatie/laravel-or-abort
Далі підключіть трейт у ваш клас (наприклад, у репозиторій). Після цього ви зможете викликати методи у форматі findOrAbort, getOrAbort тощо — залежно від імен ваших оригінальних методів.
<?php
use SpatieOrAbortSpatieOrAbortOrAbort;
class ArticleRepository
{
use SpatieOrAbortOrAbort;
public function find($id)
{
// Повертає модель або false
}
}
Тоді використання виглядатиме так:
$article = $articleRepository->findOrAbort($articleId);
Або з іншим кодом:
$article = $articleRepository->findOrAbort($articleId, 403);
Важливі нюанси
Трейт orAbort працює завдяки магічному методу __call. Це означає, що він перехоплює виклики методів, яких напряму не існує в класі, і додає потрібну поведінку.
Не використовуйте цей трейт у класах, які вже реалізують власний __call. Інакше можуть виникнути конфлікти або непередбачувана поведінка.
Підсумок
Трейт SpatieOrAbortOrAbort допомагає зробити код Laravel більш охайним: замість тернарних конструкцій і ?: abort() ви отримуєте зрозумілі методи виду findOrAbort. Це покращує читабельність, концентрує логіку зупинки в одному місці та дозволяє швидко керувати HTTP-кодом.
Ознайомитися з реалізацією можна на GitHub.