Где именно работает автоматическая инъекция в Laravel? - PullRequest
2 голосов
/ 28 января 2020

Может быть, это глупый вопрос, но официальная документация мне не ясна в этом месте. Это говорит о том, что внедрение зависимостей автоматически разрешается, например, в контроллерах. Но в моей маршрутизации я связываю свой маршрут с классом, который не наследуется от класса Controller. И автомат c впрыск работает! Означает ли это, что при разрешении каждого маршрута автоматически используется ServiceContainer и разрешаются зависимости?

В документах мы имеем:

В качестве альтернативы и, что важно, вы можете «напечатать подсказку» зависимости в конструктор класса, который разрешается контейнером, включая контроллеры, прослушиватели событий, промежуточное ПО и многое другое. Кроме того, вы можете вводить зависимости подсказок в методе handle заданий в очереди. На практике это - то, как большинство ваших объектов должно быть разрешено контейнером.

И в нем говорится "контроллеры, прослушиватели событий, промежуточное программное обеспечение и многое другое". Не могли бы вы показать мне другие места, где работает автоинъекция?

Я использую Laravel> 5.8. Спасибо.

1 Ответ

1 голос
/ 28 января 2020

Внедрение зависимости зависит от того, как вы вызываете функцию / метод, а не от самой функции.

[...] вы можете «напечатать подсказку» зависимости в конструктор класса, который разрешается контейнером

"Разрешено контейнером" означает, что вы (или в этом случае Laravel маршрутизатор) вызываете его через контейнер.

Чтобы автоматически разрешить зависимости в конструкторе, вы можете использовать app()->make():

$myThing = app()->make(MyClass::class);

Это даст вам экземпляр MyClass с разрешены зависимости конструктора.

Чтобы использовать DI для метода, вы можете использовать app()->call():

$result = app()->call([$myThing, 'someMethod']);

В общем, Laravel использует DI почти везде. Я всегда предполагаю, что это работает, и если это не так, вы можете просто разрешить зависимость вручную.

Примечание: основано на Laravel 5.4.26, но большинство, если не все , информация все еще должна быть правильной.

...