Ответ вслух Senior Laravel: контейнер и очереди спрашивают часто обновлено

Сервис-контейнер 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 ошибок.