私見、 SRPやデメテルの法則などのルールを簡単に破る可能性があるため、これは必要ありません
しかし、本当に必要な場合は、次の方法があります。
まず、「setContainer」呼び出しを持つ基本「ContainerAwareRepository」クラスを定義します。
services.yml
services:
# This is the base class for any repository which need to access container
acme_bundle.repository.container_aware:
class: AcmeBundle\Repository\ContainerAwareRepository
abstract: true
calls:
- [ setContainer, [ @service_container ] ]
ContainerAwareRepository は次のようになります
AcmeBundle\Repository\ContainerAwareRepository.php
abstract class ContainerAwareRepository extends EntityRepository
{
protected $container;
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
}
}
次に、モデル リポジトリを定義します。
ここでは、getRepository
リポジトリを構築するためにドクトリンのメソッドを使用します
services.yml
services:
acme_bundle.models.repository:
class: AcmeBundle\Repository\ModelsRepository
factory_service: doctrine.orm.entity_manager
factory_method: getRepository
arguments:
- "AcmeBundle:Models"
parent:
acme_bundle.repository.container_aware
そして、クラスを定義するだけです
AcmeBundle\Repository\ModelsRepository.php
class ModelsRepository extends ContainerAwareRepository
{
public function findFoo()
{
$this->container->get('fooservice');
}
}
リポジトリを使用するには、まずサービスから呼び出す必要があります。
$container->get('acme_bundle.models.repository')->findFoo(); // No errors
$em->getRepository('AcmeBundle:Models')->findFoo(); // No errors
しかし、あなたが直接行う場合
$em->getRepository('AcmeBundle:Models')->findFoo(); // Fatal error, container is undefined