Symfony 将@session注入EntityRepository

Symfony 将@session注入EntityRepository,symfony,doctrine,Symfony,Doctrine,我想在我的Symfony2项目中覆盖默认的条令\ORM\EntityRepository类,这样我就可以访问@session服务,这样,如果设置了某个会话变量,我的所有存储库都可以访问它 在调查中,它似乎没有我所希望的那么简单,因为EntityRepository是从Doctrine\ORM\EntityManager中实例化的,这个类本身是使用静态create方法实例化的 我遵循了中的答案,但在实际实现custom manager类时遇到了一个障碍,特别是在答案的作者说的地方,但由于您正在创建

我想在我的Symfony2项目中覆盖默认的条令\ORM\EntityRepository类,这样我就可以访问@session服务,这样,如果设置了某个会话变量,我的所有存储库都可以访问它

在调查中,它似乎没有我所希望的那么简单,因为EntityRepository是从Doctrine\ORM\EntityManager中实例化的,这个类本身是使用静态create方法实例化的

我遵循了中的答案,但在实际实现custom manager类时遇到了一个障碍,特别是在答案的作者说的地方,但由于您正在创建一个自定义实体管理器,因此可以将其连接到服务容器并注入所需的任何依赖项

我已经用重写的create函数定义了重写的EntityManager类,还重写了getRepository函数。正是在这个函数中,我认为我需要将会话添加到存储库中,因为它是在我重写的EntityRepository类上使用setSession方法创建的,但我不确定首先如何将会话实际放入管理器中,因为EntityManager类连接$conn的其他构造函数参数,配置$config、事件管理器$EventManager在Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension或mload方法中提供

我也指明了

doctrine.orm.entity_manager.class: Me\MyBundle\Doctrine\ORM\EntityManager
在我的config.yml文件中

如何让Symfony在创建存储库时使用自定义EntityManager类,并将会话注入其中?

Florian解释了如何通过服务创建存储库:

my_service:
    class: Doctrine\Common\Persistence\ObjectRepository
    factory_service: doctrine # this is an instance of Registry
    factory_method: getRepository
    arguments: [ %mytest.entity% ]
您可以添加调用以作为延迟DI调用setSession:

my_service:
    ...
    calls:
        - [setSession, ["@session"]]
这就是您要做的吗?

Florian解释了如何通过服务创建存储库:

my_service:
    class: Doctrine\Common\Persistence\ObjectRepository
    factory_service: doctrine # this is an instance of Registry
    factory_method: getRepository
    arguments: [ %mytest.entity% ]
您可以添加调用以作为延迟DI调用setSession:

my_service:
    ...
    calls:
        - [setSession, ["@session"]]

这就是你想要做的吗?

我最终选择了一些稍有不同的东西:

我用我的自定义类覆盖了doctrine.orm.entity_manager.class参数,该自定义类使用一个附加的$session参数扩展了默认类,该参数包括getter和setter,以及覆盖的create和getRepository函数,以返回我的类的实例,而不是默认的实例

然后我重写了EntityRepository类并实现了一个getSession方法,该方法返回

$this->_em->getSession();
最后,在一个可以访问实体管理器的自定义事件侦听器中,我调用了

$this->entityManager->setSession($session);

这使我能够从每个存储库访问会话。

我最终选择了一些稍有不同的内容:

我用我的自定义类覆盖了doctrine.orm.entity_manager.class参数,该自定义类使用一个附加的$session参数扩展了默认类,该参数包括getter和setter,以及覆盖的create和getRepository函数,以返回我的类的实例,而不是默认的实例

然后我重写了EntityRepository类并实现了一个getSession方法,该方法返回

$this->_em->getSession();
最后,在一个可以访问实体管理器的自定义事件侦听器中,我调用了

$this->entityManager->setSession($session);

这使我能够从每个存储库访问会话。

在Symfony 4+中,您只需将其设置为ServiceEntityRepository,通过自动连接,就不需要任何服务。yaml更改

然后以控制器为例

$repository = $this->getDoctrine()->getRepository(YourEntity::class);
$result = $repository->findSomethingUsingSession();
或者建议使用依赖注入

public function someAction(YourRepository $repository)
{
    $result = $repository->findSomethingUsingSession();
    // ...
}

在Symfony 4+中,您只需将其设置为ServiceEntityRepository,使用自动连线,就不需要任何services.yaml更改

然后以控制器为例

$repository = $this->getDoctrine()->getRepository(YourEntity::class);
$result = $repository->findSomethingUsingSession();
或者建议使用依赖注入

public function someAction(YourRepository $repository)
{
    $result = $repository->findSomethingUsingSession();
    // ...
}

这是我想做的事情,但我需要将我的自定义EntityManager类设置为默认EntityManager,因此我不知道如何告诉Doctrine使用我的而不是他们的类这是我想做的事情,但是我需要将我的自定义EntityManager类设置为默认EntityManager,因此我不确定如何告诉Doctrine使用我的而不是他们的