Ответ 1
ФАСАДЫ
Facades не являются альтернативой инъекции зависимостей.
Laravel Facade - это реализация шаблона Locator Service, создающего чистый и красивый способ доступа к объектам:
MyClass::doSomething();
Это синтаксис PHP для статических методов, но Laravel изменяет игру и делает их нестационарными за кулисами, предоставляя вам красивый, приятный и проверенный способ написания ваших приложений.
ВЗАИМОДЕЙСТВИЕ ЗАВИСИМОСТИ
Инъекция зависимостей - это, в основном, способ передачи параметров вашим конструкторам и методам, автоматически устанавливая их.
class MyClass {
private $property;
public function __construct(MyOtherClass $property)
{
/// Here you can use the magic of Dependency Injection
$this->property = $property
/// $property already is an object of MyOtherClass
}
}
Лучшей конструкцией этого было бы использование интерфейсов на конструкторах Injected Dependency Injected:
class MyClass {
private $property;
public function __construct(MyInterface $property)
{
/// Here you can use the magic of Dependency Injection
$this->property = $property
/// $property will receive an object of a concrete class that implements MyInterface
/// This class should be defined in Laravel elsewhere, but this is a way of also make
/// your application easy to maintain, because you can swap implementations of your interfaces
/// easily
}
}
Но обратите внимание, что в Laravel вы можете вводить классы и интерфейсы одинаково. Чтобы вводить интерфейсы, вам просто нужно сказать, что это будет так:
App::bind('MyInterface', 'MyOtherClass');
Это скажет Laravel, что каждый раз, когда одному из ваших методов нужен экземпляр MyInterface, он должен дать ему один из MyOtherClass.
Что здесь происходит, так это то, что этот constuctor имеет "зависимость": MyOtherClass
, который будет автоматически вводиться Laravel с помощью контейнера IoC. Итак, создав экземпляр MyClass
, Laravel автоматически создаст экземпляр MyOtherClass
и поместит его в переменную $class
.
Dependency Injection - это просто разработчик нечетного жаргона, созданный для того, чтобы сделать что-то простое, как "автоматическая генерация параметров".
ПРИ ИСПОЛЬЗОВАНИИ ОДНОГО ИЛИ ДРУГОГО?
Как вы можете видеть, это совершенно разные вещи, поэтому вам никогда не придется выбирать между ними, но вам придется решать, куда идти с тем или другим в разных частях вашего приложения.
Использовать Facades, чтобы облегчить запись кода. Например: хорошая практика создания пакетов для ваших модулей приложений, поэтому для создания Фасадов для этих пакетов также можно сделать их похожими на открытый класс Laravel и получить доступ к ним с использованием статического синтаксиса.
Использовать инъекцию зависимостей каждый раз, когда ваш класс должен использовать данные или обрабатывать их из другого класса. Это сделает ваш код поддающимся проверке, потому что вы сможете "привить" из себя эти зависимости в свой класс, и вы также будете выполнять принцип единой ответственности (возьмите посмотрите на SOLID принципы).