WEB-Программист
Перемкнути навігацію

Мова

  • Українська
  • Русский
  • Polski
  • Українська
  • Русский
  • Polski
Зв'яжіться з нами

Пошук

  • Книги
  • wordpress [UK]
  • Laravel [UK]
  • Articles
  • Немає категорій
  • © 2015-2026 Andrii Beznosko

  • Hosting CityHost

Розширюємо класи Laravel методом `orAbort` за допомогою трейту

  • Опис
  • Опис/Завантаження

Розширюємо класи 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.

Comments
Всього коментарів: 0
Залишити коментар Скасувати відповідь

Ваш email не буде опубліковано.

Категорія: Главная » Laravel » Розширюємо класи Laravel методом `orAbort` за допомогою трейту
Статус: Для продвинутых программистов
Original article link (if specified or if this article is not authored by us) Download
Submitted by Кві 17, 2026 00:21 Andriy

Articles published on WEB-Программист are provided with source links. The site administration is not responsible for your use of these materials.

Laravel
Previous Next

Дивіться також:

Робота з nullable-полями в Eloquent у Laravel

Вступ Якщо у вас є кілька моделей у Laravel з одним nullable-полем, створення мутатора для цього поля — процес доволі тривіальний: public function setNicknameAttribute($nickname) { $this->attributes['nickname'] = trim($nickname) == '' ? null : trim($nickname); }   Тут ми перевіряємо вхідні...

DDD Ultra-Light

[caption id="attachment_547" align="aligncenter" width="891"] Laravel 4.2[/caption] DDD Ultra-Light: як застосувати Domain-Driven Design без зайвих витрат Деякі команди вважають Domain-Driven Design (DDD) складним, дорогим і таким, що потребує обережного впровадження. І справді: якщо підходити до DDD як до «великого проєкту перебудови»,...

Розширюємо класи Laravel методом `orAbort` за допомогою трейту

Розширюємо класи Laravel методом orAbort за допомогою трейту Іноді в Laravel ми пишемо однаковий шаблон: намагаємося отримати модель або одразу зупиняємо виконання з потрібним HTTP-кодом. Це працює, але код стає менш читабельним, а логіка розкидається по всьому проєкту. Вихід —...

Створення пакетів для Laravel

Prosper Otemuyiwa нещодавно написав статтю про те, як створювати пакети для Laravel 5 у своєму блозі. Хоча його спосіб абсолютно правильний і може вам підійти, я віддаю перевагу трохи іншому підходу до створення пакетів. Спочатку я створю новий репозиторій на...

Зв'яжіться з нами

- Преміум теми та плагіни WP Star безкоштовно -

We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept”, you consent to the use of ALL the cookies.
Cookie settingsACCEPT
Manage consent

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
SAVE & ACCEPT