Контракти

Вступ

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 та їх еквівалентних фасадах:

Контракт Відповідає фасаду
Illuminate\Contracts\Auth\Access\Authorizable  
Illuminate\Contracts\Auth\Access\Gate Gate
Illuminate\Contracts\Auth\Authenticatable  
Illuminate\Contracts\Auth\CanResetPassword  
Illuminate\Contracts\Auth\Factory Auth
Illuminate\Contracts\Auth\Guard Auth::guard()
Illuminate\Contracts\Auth\PasswordBroker Password::broker()
Illuminate\Contracts\Auth\PasswordBrokerFactory Password
Illuminate\Contracts\Auth\StatefulGuard  
Illuminate\Contracts\Auth\SupportsBasicAuth  
Illuminate\Contracts\Auth\UserProvider  
Illuminate\Contracts\Broadcasting\Broadcaster Broadcast::connection()
Illuminate\Contracts\Broadcasting\Factory Broadcast
Illuminate\Contracts\Broadcasting\ShouldBroadcast  
Illuminate\Contracts\Broadcasting\ShouldBroadcastNow  
Illuminate\Contracts\Bus\Dispatcher Bus
Illuminate\Contracts\Bus\QueueingDispatcher Bus::dispatchToQueue()
Illuminate\Contracts\Cache\Factory Cache
Illuminate\Contracts\Cache\Lock  
Illuminate\Contracts\Cache\LockProvider  
Illuminate\Contracts\Cache\Repository Cache::driver()
Illuminate\Contracts\Cache\Store  
Illuminate\Contracts\Config\Repository Config
Illuminate\Contracts\Console\Application  
Illuminate\Contracts\Console\Kernel Artisan
Illuminate\Contracts\Container\Container App
Illuminate\Contracts\Cookie\Factory Cookie
Illuminate\Contracts\Cookie\QueueingFactory Cookie::queue()
Illuminate\Contracts\Database\ModelIdentifier  
Illuminate\Contracts\Debug\ExceptionHandler  
Illuminate\Contracts\Encryption\Encrypter Crypt
Illuminate\Contracts\Events\Dispatcher Event
Illuminate\Contracts\Filesystem\Cloud Storage::cloud()
Illuminate\Contracts\Filesystem\Factory Storage
Illuminate\Contracts\Filesystem\Filesystem Storage::disk()
Illuminate\Contracts\Foundation\Application App
Illuminate\Contracts\Hashing\Hasher Hash
Illuminate\Contracts\Http\Kernel  
Illuminate\Contracts\Mail\Mailable  
Illuminate\Contracts\Mail\Mailer Mail
Illuminate\Contracts\Mail\MailQueue Mail::queue()
Illuminate\Contracts\Notifications\Dispatcher Notification
Illuminate\Contracts\Notifications\Factory Notification
Illuminate\Contracts\Pagination\LengthAwarePaginator  
Illuminate\Contracts\Pagination\Paginator  
Illuminate\Contracts\Pipeline\Hub  
Illuminate\Contracts\Pipeline\Pipeline Pipeline
Illuminate\Contracts\Queue\EntityResolver  
Illuminate\Contracts\Queue\Factory Queue
Illuminate\Contracts\Queue\Job  
Illuminate\Contracts\Queue\Monitor Queue
Illuminate\Contracts\Queue\Queue Queue::connection()
Illuminate\Contracts\Queue\QueueableCollection  
Illuminate\Contracts\Queue\QueueableEntity  
Illuminate\Contracts\Queue\ShouldQueue  
Illuminate\Contracts\Redis\Factory Redis
Illuminate\Contracts\Routing\BindingRegistrar Route
Illuminate\Contracts\Routing\Registrar Route
Illuminate\Contracts\Routing\ResponseFactory Response
Illuminate\Contracts\Routing\UrlGenerator URL
Illuminate\Contracts\Routing\UrlRoutable  
Illuminate\Contracts\Session\Session Session::driver()
Illuminate\Contracts\Support\Arrayable  
Illuminate\Contracts\Support\Htmlable  
Illuminate\Contracts\Support\Jsonable  
Illuminate\Contracts\Support\MessageBag  
Illuminate\Contracts\Support\MessageProvider  
Illuminate\Contracts\Support\Renderable  
Illuminate\Contracts\Support\Responsable  
Illuminate\Contracts\Translation\Loader  
Illuminate\Contracts\Translation\Translator Lang
Illuminate\Contracts\Validation\Factory Validator
Illuminate\Contracts\Validation\ValidatesWhenResolved  
Illuminate\Contracts\Validation\ValidationRule  
Illuminate\Contracts\Validation\Validator Validator::make()
Illuminate\Contracts\View\Engine  
Illuminate\Contracts\View\Factory View
Illuminate\Contracts\View\View View::make()