Как в Symfony 3.4 назначить DI реализацию для интерфейса

Стандартная задача для многих современных фреймворков поддерживающих концепции Service Container и Dependency Injection — попросить контейнер возвращать по имени интерфейса заданную реализацию этого интерфейса.  Например, в Laravel это делается достаточно понятным методом bind:

$this->app->bind(\Lib\Phone\PhoneClientInterface::class, \Lib\Phone\SmsRegist::class);

Однако, в Symfony всё не так просто. Ещё раз повторюсь что Symfony, пожалуй самый не user-friendly PHP фреймворк текущего времени. Многие вещи интуитивно не понятны и требуют постоянного чтения документации и изучения обсуждений в интернетах. Ещё одна простая задача, которая в Symfony 3.4 сделана абсолютно не интуитивно.

$container->setAlias(\Lib\Phone\PhoneClientInterface::class, \Lib\Phone\SmsRegist::class);

Выглядит просто, но догадаться что биндинг имплементации к интерфейсу делается через метод setAlias крайне сложно. Даже если прочитать описание метода в коде — там нет ни слова о назначении реализации на интерфейс.

/**
 * Sets an alias for an existing service.
 *
 * @param string       $alias The alias to create
 * @param string|Alias $id    The service to alias
 *
 * @return Alias
 *
 * @throws InvalidArgumentException if the id is not a string or an Alias
 * @throws InvalidArgumentException if the alias is for itself
 */

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *