Контракты
Введение
«Контракты» Laravel - это набор интерфейсов, которые определяют основные сервисы, предоставляемые фреймворком. Например, контракт Illuminate\Contracts\Queue\Queue
определяет методы, необходимые для постановки заданий в очередь, а контракт Illuminate\Contracts\Mail\Mailer
определяет методы, необходимые для отправки электронной почты.
Каждый контракт имеет соответствующую реализацию, предусмотренную структурой. Например, Laravel предоставляет реализацию очереди с множеством драйверов и реализацию почтовой программы, которая работает на SwiftMailer.
Все контракты Laravel находятся в их собственном репозитории GitHub. Это обеспечивает быструю справочную информацию для всех доступных контрактов, а также единый несвязанный пакет, который можно использовать при создании пакетов, взаимодействующих со службами Laravel.
Контракты против Фасадов
Laravel фасады и вспомогательные функции предоставляют простой способ использования сервисов Laravel без необходимости вводить подсказки и разрешать контракты из контейнера сервиса. В большинстве случаев каждый фасад имеет эквивалентный контракт.
В отличие от фасадов, которые не требуют, чтобы Вы требовали их в конструкторе Вашего класса, контракты позволяют Вам определять явные зависимости для Ваших классов. Некоторые разработчики предпочитают явно определять свои зависимости таким образом и поэтому предпочитают использовать контракты, в то время как другим разработчикам нравится удобство фасадов. В общем, большинство приложений могут без проблем использовать фасады во время разработки.
Когда использовать контракты
Решение использовать контракты или фасады будет зависеть от личного вкуса и вкусов Вашей команды разработчиков. И контракты, и фасады могут использоваться для создания надежных, хорошо протестированных приложений Laravel. Контракты и фасады не исключают друг друга. Некоторые части Ваших приложений могут использовать фасады, а другие зависят от контрактов. Пока Вы сосредотачиваете обязанности своего класса, Вы заметите очень мало практических различий между использованием контрактов и фасадов.
В общем, большинство приложений могут без проблем использовать фасады во время разработки. Если Вы создаете пакет, который интегрируется с несколькими фреймворками PHP, Вы можете использовать пакет illuminate/contracts
для определения своей интеграции со службами Laravel без необходимости требовать конкретных реализаций Laravel в файле composer.json
Вашего пакета.
Как использовать контракты
Итак, как получить выполнение контракта? На самом деле это довольно просто.
Многие типы классов в Laravel разрешаются через сервис контейнер, включая контроллеры, прослушиватели событий, мидлвары, задания в очереди и даже замыкания маршрутов. Итак, чтобы получить реализацию контракта, Вы можете просто «напечатать» интерфейс в конструкторе разрешаемого класса.
Например, взгляните на этот прослушиватель событий:
<?php namespace App\Listeners; use App\Events\OrderWasPlaced;use App\Models\User;use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation{ /** * Реализация фабрики Redis. * * @var \Illuminate\Contracts\Redis\Factory */ protected $redis; /** * Создайте новый экземпляр обработчика событий. * * @param \Illuminate\Contracts\Redis\Factory $redis * @return void */ public function __construct(Factory $redis) { $this->redis = $redis; } /** * Обработать событие. * * @param \App\Events\OrderWasPlaced $event * @return void */ public function handle(OrderWasPlaced $event) { // }}
Когда прослушиватель событий разрешен, сервис-контейнер будет читать подсказки типов в конструкторе класса и вводить соответствующее значение. Чтобы узнать больше о регистрации вещей в сервис-контейнере, ознакомьтесь с его документацией.
Справочник контрактов
Эта таблица предоставляет быстрый справочник по всем контрактам Laravel и их эквивалентным фасадам: