Прямой доступ к содержимому контейнера реализован несколькими способами. Для того чтобы выбрать необходимый способ, который будет подходящим для создания кода конкретного проекта, необходимо рассмотреть все плюсы и минусы каждого подхода, а также варианты их тестирования.
Классы, унаследованные от класса Hleb\Base\Container получают дополнительные возможности в виде методов и свойство $this->container для обращения к сервисам. Стандартные классы фреймворка — контроллеры, middlewares, команды, события, уже унаследованы от этого класса.
Если для сервиса в интерфейсе контейнера назначен собственный метод, то сервис можно получить через этот метод. Получение демонстрационного сервиса на примере контроллера:
Ссылка на контейнер хранится в свойстве $this->config (ключ 'container' в массиве) объекта класса унаследованного от Hleb\Base\Container.
При создании указанного объекта можно присвоить другое значение (например, c тестовым контейнером) в аргументе 'config'.
Иначе, если не указан конкретный контейнер в аргументе 'config' или отсутствует сам аргумент 'config' конструктора, то контейнер будет создан по умолчанию.
Исключения составляют классы Моделей, в них аналогичное получение сервиса будет таким:
Доступ к контейнеру с сервисами предоставляет также класс Hleb\Static\Container, пример:
В папке /vendor/phphleb/framework/Static/ находятся классы-обёртки над стандартными сервисами фреймворка, которые можно использовать в коде аналогично классу Hleb\Static\Container, только для отдельных сервисов.
Эти сервисы можно получить и предыдущими перечисленными способами.
Из-за существования различных подходов в именовании интерфейсов, получение стандартных сервисов из контейнера может быть как по интерфейсу с окончанием Interface, так и без. Например, Hleb\Reference\RequestInterface аналогичен Hleb\Reference\Interface\Request.
← Устройство контейнера Внедрение зависимостей →