Разбираемся с DI контейнером в Laravel

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

Можно много гадать почему именно так происходит. Потому что эта составляющая не предназначена для решения практических задач напрямую (как, например кеширование, роутинг, почта, аутентификация, биллинг и многое другое)? Может быть потому, что идея ломает стереотипы императивного программирования, когда для создания объекта от класса (далее "инстанциирование") требуется явно указывать аргументы? Мне не известно. Ну просто потому что так. %)

DI? WTF? TLDR PLZ!

Короче, эта фигня нужна для того, чтобы компонент "А" знал о том, что компонент "Б" прыгает как заяц, но не знал какого цвета этот заяц и иногда ему можно было подсовывать тренированного крокодила.

Сегодня мы разберёмся в способе хранения данных, автовайринге (autowire) - термине, пришедшем к нам из мира Symfony и Spring, и двойной диспатчеризации (double dispatch) без этих дурацких умных слов и русским языком. Научимся таргетировать инъекции и попробуем запилить пример реализации с использованием одних и тех же контроллеров, отвечающих на HTTP запросы (внезапно!), а ещё и на консольные, и ещё какие-нибудь. Как всегда, я рассказал об этом в онлайн-трансляции, которая доступна в виде записи, в очередной раз под эпичную музычку: