従来、サービスコンテナは次のように使用していました。
$container->get('my_service');
ただし、特定のクラスの定義が1つしかない場合は、このサービスをクラス名で取得したいと思います。
$container->xxx('My\Application\Service');
これはサービスコンテナで可能ですか?
従来、サービスコンテナは次のように使用していました。
$container->get('my_service');
ただし、特定のクラスの定義が1つしかない場合は、このサービスをクラス名で取得したいと思います。
$container->xxx('My\Application\Service');
これはサービスコンテナで可能ですか?
いいえ、それは不可能です。理由は次のとおりです。
[1]この1つのクラスが一度だけ現れると言うことは、DIC自体にエッジケースを実装するための良い議論ではありません。
Symfony 3.3以降、次のことが可能です。
たとえば、次のようなUserManagerがある場合:
services:
# ...
# traditional service definition
app.manager.user:
class: AppBundle\EventListener\UserManager
tags: ['kernel.event_subscriber']
次に、次の方法で取得できます。
// before Symfony 3.3
$this->get('app.manager.user')->save($user);
// Symfony 3.3+
$this->get(UserManager::class)->save($user);