# Контейнер сервисов

Контейнер Elang реализует PSR-11. Он разрешает конкретные классы через внедрение зависимостей в конструктор и поддерживает явные привязки для интерфейсов и скалярных значений конфигурации.

## Привязка интерфейса

```php
$app->container->bind(Clock::class, SystemClock::class);
```

При разрешении привязки создаётся новый сервис. Используйте замыкание, если сервису нужна конфигурация.

## Общие сервисы

```php
use Elang\Container\Container;

$app->container->singleton(Client::class, fn (Container $container) =>
    new Client('https://api.example.com')
);
```

`singleton()` повторно использует один экземпляр. `instance()` регистрирует существующее значение. Конкретные классы без привязки каждый раз создаются заново. Циклические зависимости вызывают исключение контейнера с цепочкой разрешения.

## Внедрение зависимостей

```php
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-обработчиками не включена.
