Сервис-контейнер Laravel
Вопрос
Расскажите, как работает сервис-контейнер Laravel и как вы им пользуетесь.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Регистрация: bind, singleton, scoped, instance
Auto-wiring конкретных классов через рефлексию
Привязка интерфейса к реализации в сервис-провайдере
Контекстная привязка: when()->needs()->give()
Фасады и хелпер app() как доступ к контейнеру
Подмена реализаций в тестах
Что могут спросить следом
- Чем фасад отличается от внедрения через конструктор?
- Что опасно в синглтонах при Octane?
Разбор
Контейнер отвечает на вопрос «как создать объект этого типа». Конкретные классы он создаёт сам: читает конструктор через рефлексию и рекурсивно разрешает зависимости. Поэтому в контроллер достаточно указать тип в конструкторе или параметре метода.
Регистрирую явно три вещи. Интерфейсы: в сервис-провайдере bind(PaymentGateway::class, YooKassaGateway::class). Объекты с конфигурацией или скалярами: через замыкание-фабрику. Общие экземпляры: singleton для дорогих клиентов, а для того, что зависит от запроса, scoped. Если двум классам нужны разные реализации одного интерфейса, использую контекстную привязку when(...)->needs(...)->give(...).
Фасады это статический доступ к сервисам контейнера, удобно, но зависимость не видна в конструкторе. В своих сервисах предпочитаю внедрение через конструктор, а в тестах подменяю реализации через $this->app->instance() или фейки фасадов вроде Mail::fake().
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.