Подтвердить что ты не робот

Различия между контрактами и фасадами laravel

Я делаю laravel с 4 месяцев. Я не вижу ясной разницы между фасадами и контрактами, поскольку оба они являются интерфейсами. Почему я вместо фасадов вместо контрактов или контрактов использую фасады?

4b9b3361

Ответ 1

Тот факт, что они оба являются интерфейсами, не делает их более похожими, чем если бы у нас было два класса.

Контракты обычно являются термином, используемым для обозначения интерфейсов, которые обеспечивают строгую границу между некоторыми функциями вашего кода и вызывающим абонентом/клиентами. Контракт - это способ обеспечения последовательного интерфейса с функциональностью. Как правило, после того, как вы определили контракт, его не следует изменять. Это означает, что вы можете реализовать интерфейс в любом случае (или даже менять различные реализации), но клиенты всегда будут использовать одни и те же методы интерфейса. Изменение реализации не повлияет на код клиента. В основе классифицированных непосредственно влияют определения контрактов.

Фасад с другой стороны - способ упрощения некоторых функций кода для клиента. Я думаю, что многие ларавельные фасады (такие как "Маршрут и запрос" ) на самом деле сопоставляются с множеством разных классов/интерфейсов. Это избавляет вас от необходимости запоминать, какой из классов выполняет задание: просто вызовите фасад и дайте ему обработать его.

Шаблон проектирования фасадов часто используется, когда система очень сложна или сложна для понимания, потому что система имеет большое количество взаимозависимых классов или ее исходный код недоступен. Этот шаблон скрывает сложности более крупной системы и обеспечивает более простой интерфейс для клиента. wikipedia

Пока я думаю, что laravel использует интерфейсы с его фасадами, интерфейсы не определяют базовые классы. На самом деле, вполне вероятно, что если подписи подклассов классов классов изменились, вы, вероятно, перепишете фасад, чтобы быть похожим. Фасад заключается не в том, чтобы сделать строгий контракт, а в том, чтобы сделать вещи проще.

UPDATE Как вы правильно определили в своем комментарии, Laravel Facades имеют статические методы. Вы можете легко называть их в своем коде, не вводя их (хотя с точки зрения теста это ужасная идея). Тот факт, что Laravel Facades является статическим, является выбором реализации Laravel (восходит к L3, где все классы laravel были статическими), это не имеет никакого отношения к строгому определению Фасадов.

Возможно, ответ на ваш вопрос таков: Фасады - это наследие от L3. Есть много сообщений в блоге для использования и использования Laravel статических классов. Я думаю, что в конце концов команда разработчиков laravel решила предложить оба варианта.

Несмотря на то, что я представил точное определение контрактов и фасадов выше, возможно, в Laravel простое отличие состоит в том, что фасады являются статическими классами, а контракты реализуются классами экземпляров. Тогда это все радует.

Из документов Laravel

Laravel "фасады" служат в качестве "статических прокси" для базовых классов в контейнере службы, обеспечивая преимущество кратковременного выразительного синтаксиса, сохраняя при этом большую тестируемость и гибкость, чем традиционные статические методы.

Ответ 2

Вопрос о том, использовать ли Facade или Contract, сводится к тому, как вы хотите разрешить свои классы и хотите ли вы использовать интерфейсы.

Фасад

  • Фасад - это класс, а не интерфейс (здесь - пример фасада).

  • Фасад только используется для более удобной загрузки класса из сервисного контейнера

  • Класс, который будет загружен, является сдерживанием в методе getFacadeAccessor() класса фасада.

Пример:

// Without facade - resolving from service container
app('some_service')->methodName();

// Do the same through facade:
someService::methodName();

Contract

  • контрактаКонтракт - это интерфейс (здесь - пример)
  • Контракт используется для загрузки класса из сервисного контейнера, более удобный И в качестве интерфейса
  • Класс, который будет загружен, определяется в контейнере службы, см. Привязка интерфейсов к реализациям

Пример. Предполагается, что класс some_service реализует интерфейс Illuminate\Contracts\Config\Repository:

// resolving class directly from service container
app('some_service')->methodName();

// resolve through binding from contract
app('Illuminate\Contracts\Config\Repository')::methodName();