Контейнер сервисов
Контейнер Elang реализует PSR-11. Он разрешает конкретные классы через внедрение зависимостей в конструктор и поддерживает явные привязки для интерфейсов и скалярных значений конфигурации.
Привязка интерфейса
$app->container->bind(Clock::class, SystemClock::class);
При разрешении привязки создаётся новый сервис. Используйте замыкание, если сервису нужна конфигурация.
Общие сервисы
use Elang\Container\Container;
$app->container->singleton(Client::class, fn (Container $container) =>
new Client('https://api.example.com')
);
singleton() повторно использует один экземпляр. instance() регистрирует существующее значение. Конкретные классы без привязки каждый раз создаются заново. Циклические зависимости вызывают исключение контейнера с цепочкой разрешения.
Внедрение зависимостей
final class ReportController
{
public function __construct(private ReportService $reports) {}
}
Для скалярных аргументов нужна явная фабрика или значение по умолчанию. Объединённые типы не разрешаются автоматически. Именованные значения маршрута имеют приоритет перед внедряемыми аргументами обработчика.
Провайдеры сервисов
Реализуйте Elang\Contracts\ServiceProvider с методами register(Container $container) и boot(Application $app), затем вызовите $app->provider(new MyProvider()). Регистрируйте зависимости до добавления маршрутов или слушателей, которые их используют.
Сервисы, связанные с текущим запросом, должны оставаться непостоянными. Сейчас Elang ориентирован на обычный жизненный цикл PHP-запросов; интеграция с долгоживущими HTTP-обработчиками не включена.