Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас

Контракти

Вступ

«Контракти» Laravel - це набір інтерфейсів, що визначають основні сервіси фреймворку. Наприклад, контракт Illuminate\Contracts\Queue\Queue визначає методи, потрібні для постановки завдань у чергу, а контракт Illuminate\Contracts\Mail\Mailer - методи, потрібні для надсилання електронної пошти.

Кожен контракт має відповідну реалізацію, яку надає фреймворк. Наприклад, Laravel надає реалізацію черг із різноманітними драйверами та реалізацію поштового модуля на основі Symfony Mailer.

Усі контракти Laravel живуть у власному репозиторії на GitHub. Це дає швидкий довідник усіх доступних контрактів, а також єдиний незалежний пакет, який можна використовувати, створюючи пакети, що взаємодіють із сервісами Laravel.

Контракти проти фасадів

Фасади та функції-хелпери Laravel дають простий спосіб користуватися сервісами Laravel, не вказуючи типів і не розв'язуючи контракти із сервіс-контейнера. У більшості випадків кожен фасад має рівнозначний контракт.

На відміну від фасадів, які не потребують оголошення в конструкторі вашого класу, контракти дозволяють визначати явні залежності класів. Одні розробники віддають перевагу такому явному визначенню залежностей і тому обирають контракти, інші ж цінують зручність фасадів. Загалом більшість застосунків може без проблем користуватися фасадами під час розробки.

Коли використовувати контракти

Вибір між контрактами й фасадами залежить від особистих уподобань ваших і вашої команди розробки. І контракти, і фасади дозволяють створювати надійні, добре протестовані застосунки Laravel. Вони не є взаємовиключними. Одні частини вашого застосунку можуть використовувати фасади, тоді як інші залежатимуть від контрактів. Доки ви тримаєте відповідальність класів зосередженою, практичної різниці між контрактами й фасадами майже не помітите.

Загалом більшість застосунків може без проблем користуватися фасадами під час розробки. Якщо ж ви створюєте пакет, що інтегрується з кількома PHP-фреймворками, вам може знадобитися пакет illuminate/contracts, щоб визначити свою інтеграцію із сервісами Laravel, не додаючи конкретних реалізацій Laravel до файлу composer.json вашого пакета.

Як використовувати контракти

Отже, як отримати реалізацію контракту? Насправді це доволі просто.

Багато типів класів у Laravel розв'язуються через сервіс-контейнер - зокрема контролери, слухачі подій, middleware, завдання в чергах і навіть замикання маршрутів. Тож щоб отримати реалізацію контракту, достатньо вказати тип інтерфейсу в конструкторі класу, який розв'язується.

Наприклад, погляньте на цей слухач подій:

<?php

namespace App\Listeners;

use App\Events\OrderWasPlaced;
use App\Models\User;
use Illuminate\Contracts\Redis\Factory;

class CacheOrderInformation
{
    /**
     * Create the event listener.
     */
    public function __construct(
        protected Factory $redis,
    ) {}

    /**
     * Handle the event.
     */
    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()