git 0ab96f0b7c55966f5402b99e37268a0e9dacd03e
«Контракты» Laravel – это набор интерфейсов, которые определяют основные службы фреймворка. Например, контракт Illuminate\Contracts\Queue\Queue
определяет методы, необходимые для постановки заданий в очередь, а контракт Illuminate\Contracts\Mail\Mailer
– для отправки электронной почты.
Каждый контракт имеет соответствующую реализацию, предусмотренную структурой. Например, Laravel предлагает реализацию очереди с множеством драйверов и реализацию почтовой программы, которая работает на SwiftMailer.
Все контракты Laravel находятся в их собственном репозитории GitHub. Это обеспечивает быстрый доступ к списку всех доступных контрактов, а также единый, отдельный пакет, который используется разработчиками пакетов, взаимодействующих со службами Laravel.
Фасады и глобальные помощники Laravel обеспечивают простой способ использования служб Laravel без объявления типов зависимости и извлечения их реализаций из контейнера служб. В большинстве случаев каждый фасад имеет эквивалентный контракт.
В отличие от фасадов, которые не требуют, чтобы они находились в конструкторе вашего класса, контракты позволяют вам определять явные зависимости для ваших классов. Некоторые разработчики предпочитают явно определять свои зависимости таким образом и поэтому предпочитают использовать контракты, в то время как другие разработчики пользуются удобством фасадов. В общем, большинство приложений могут без проблем использовать фасады во время разработки.
Решение об использовании контрактов или фасадов будет зависеть от личного вкуса и вкусов вашей команды разработчиков. И контракты, и фасады могут использоваться для создания надежных, хорошо тестируемых приложений Laravel. Контракты и фасады не исключают друг друга. Некоторые части ваших приложений могут использовать фасады, а другие могут зависеть от контрактов. До тех пор, пока вы сосредоточены на обязанностях класса, вы не заметите практических различий между использованием контрактов и фасадов.
В общем, большинство приложений могут без проблем использовать фасады во время разработки. Если вы создаете пакет, который интегрируется с несколькими фреймворками PHP, то вы можете указать пакет illuminate/contracts
в файле composer.json
вашего пакета для определения вашей интеграции со службами Laravel без необходимости требований конкретных реализаций Laravel.
Итак, как получить реализацию контракта? На самом деле это довольно просто.
Многие типы классов в 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 и их эквивалентным фасадам: