Laravel (5,7) Контракты
Вступление
Контракты Laravel - это набор интерфейсов, которые определяют основные сервисы, предоставляемые платформой. Например, контракт Illuminate / Contracts / Queue / Queue определяет методы, необходимые для работы с очередями, в то время как контракт Illuminate / Contracts / mail / Mailer определяет методы, необходимые для отправки электронной почты.
Весь контракт имеет соответствующую реализацию, предусмотренную рамками. Например, Laravel предоставляет реализацию очереди с различными драйверами и реализацию почтовой программы на основе SwiftMailer .
Контракты Laravel живут в собственном репозитории GitHub. Это обеспечивает быструю контрольную точку для всех доступных контрактов, а также отдельный, отсоединенный пакет, который может использоваться разработчиками пакетов.
Контракты Vs. Фасады
Фасады и вспомогательные функции Laravel обеспечивают способ использования сервисов Laravel без необходимости вводить подсказки и разрешать контракты из сервисного контейнера. В большинстве случаев каждый фасад имеет эквивалентный контракт.
Большинство приложений будет хорошо, независимо от того, предпочитаете ли вы фасады или контракты. Однако, если вы создаете пакет, вам следует рассмотреть возможность использования контрактов, поскольку их будет проще тестировать в контексте пакета.
Когда использовать контракты
Контракты или фасады будут сводиться к личному вкусу и вкусам вашей команды разработчиков. И контракты, и фасады могут быть использованы для создания надежных, хорошо протестированных приложений Laravel. Пока вы сосредоточены на обязанностях своего класса, вы заметите очень мало практических различий между использованием контрактов и фасадов.
Слабая связь
Сначала давайте рассмотрим некоторый код, тесно связанный с реализацией кеша. Учтите следующее.
Давайте посмотрим на простой пример.
<?php
namespace App\Orders;
class Repository
{
protected $cache;
public function __construct(\SomePackage\Cache\Memcached $cache)
{
$this->cache = $cache;
}
public function find($id)
{
if ($this->cache->has($id)) {
//
}
}
}
В этом классе код тесно связан с данной реализацией кеша. Он тесно связан, потому что мы зависим от конкретного класса Cache от поставщика пакетов. Если API этого пакета изменится, наш код также должен измениться.
Вместо этого мы можем улучшить наш код, полагаясь на простой, независимый от поставщика интерфейс.
Давайте посмотрим на простой пример.
<?php
namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository
{
protected $cache;
public function __construct(Cache $cache)
{
$this->cache = $cache;
}
}
Теперь код не связан с каким-либо конкретным поставщиком или даже Laravel. Поскольку пакет контрактов не содержит реализацию и никаких зависимостей, вы можете легко написать альтернативную реализацию любого данного контракта, позволяющую заменить реализацию кеша без изменения какого-либо кода, потребляющего кеш.
Как использовать контракты
Многие типы классов в Laravel разрешаются через контейнер служб, включая контроллер, прослушиватели событий, промежуточное программное обеспечение, задания в очереди и даже замыкания маршрутов. Таким образом, чтобы получить реализацию контракта, вы можете просто напечатать подсказку интерфейса в конструкторе разрешаемого класса.
Давайте посмотрим на простой пример.
<?php
namespace App\Listeners;
use App\User;
use App\Events\OrderWasPlaced;
use Illuminate\Contracts\Redis\Database;
class CacheOrderInformation
{
protected $redis;
public function __construct(Database $redis)
{
$this->redis = $redis;
}
public function handle(OrderWasPlaced $event)
{
//
}
}
Предыдущая: Laravel (5.7) Фасады
Далее: Laravel (5.7) Маршрутизация
Новый контент: Composer: менеджер зависимостей для PHP , R программирования