Стандартная задача для многих современных фреймворков поддерживающих концепции 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 */