Контракти
Вступ
Laravel "контракти" - це набір інтерфейсів, які визначають основні сервіси, що надаються фреймворком. Наприклад, контракт Illuminate\Contracts\Queue\Queue визначає методи, необхідні для постановки завдань у чергу, тоді як контракт Illuminate\Contracts\Mail\Mailer визначає методи, необхідні для відправки електронної пошти.
Кожен контракт має відповідну реалізацію, надану фреймворком. Наприклад, Laravel надає реалізацію черги з різноманітними драйверами, а також реалізацію поштовика, яка працює на основі Symfony Mailer.
Всі контракти Laravel знаходяться в їхньому власному репозиторії GitHub. Це забезпечує швидкий доступ до всіх доступних контрактів, а також єдиний, незалежний пакет, який може бути використаний при створенні пакетів, що взаємодіють з сервісами Laravel.
Контракти проти Фасадів
Laravel's фасади та допоміжні функції надають простий спосіб використання сервісів Laravel без необхідності вказувати тип і вирішувати контракти з сервіс-контейнера. У більшості випадків кожен фасад має еквівалентний контракт.
На відміну від фасадів, які не вимагають від вас включати їх у конструктор вашого класу, контракти дозволяють вам визначати явні залежності для ваших класів. Деякі розробники віддають перевагу явному визначенню своїх залежностей таким чином і тому віддають перевагу використанню контрактів, тоді як інші розробники насолоджуються зручністю фасадів. Загалом, більшість застосунків можуть використовувати фасади без проблем під час розробки.
Коли використовувати Контракти
Рішення використовувати контракти чи фасади залежатиме від особистих уподобань та уподобань вашої команди розробників. І контракти, і фасади можуть бути використані для створення надійних, добре протестованих Laravel застосунків. Контракти та фасади не є взаємовиключними. Деякі частини ваших застосунків можуть використовувати фасади, тоді як інші залежать від контрактів. Поки ви зосереджуєте відповідальність ваших класів, ви помітите дуже мало практичних відмінностей між використанням контрактів і фасадів.
Загалом, більшість застосунків можуть використовувати фасади без проблем під час розробки. Якщо ви створюєте пакет, який інтегрується з декількома PHP фреймворками, ви можете захотіти використовувати пакет illuminate/contracts для визначення вашої інтеграції з сервісами Laravel без необхідності вимагати конкретні реалізації Laravel у файлі composer.json вашого пакета.
Як використовувати контракти
Отже, як отримати реалізацію контракту? Це насправді досить просто.
Багато типів класів у Laravel вирішуються через сервіс-контейнер, включаючи контролери, слухачі подій, middleware, завдання в черзі, і навіть замикання маршрутів. Отже, щоб отримати реалізацію контракту, ви можете просто "type-hint" інтерфейс у конструкторі класу, що вирішується.
Наприклад, погляньте на цей слухач подій:
<?php namespace App\Listeners; use App\Events\OrderWasPlaced; use App\Models\User; use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation { /** * Створити слухача подій. */ public function __construct( protected Factory $redis, ) {} /** * Обробити подію. */ public function handle(OrderWasPlaced $event): void { // ... } }
Коли слухач події вирішується, сервіс-контейнер зчитує типи підказок у конструкторі класу та впроваджує відповідне значення. Щоб дізнатися більше про реєстрацію речей у сервіс-контейнері, перегляньте його документацію.
Посилання на Контракт
Ця таблиця надає швидкий довідник по всіх контрактах Laravel та їх еквівалентних фасадах:
