将@session注入EntityRepository

时间:2013-12-21 16:40:33

标签: symfony doctrine

我想覆盖Symfony2项目中的默认Doctrine\ORM\EntityRepository类,以便我可以访问@session服务,以便我的所有存储库都可以访问某个会话变量(如果已设置)

在调查时,它看起来并不像我希望的那么简单,因为EntityRepository是从Doctrine\ORM\EntityManager中实例化的,而且这个类是使用静态“create”方法实例化的。

我在Injecting dependency into entity repository中听到了答案,但在实际实现自定义管理器类时遇到了障碍(特别是在答案的作者说“但是因为您正在制作自定义实体管理器,您可以将其连接到服务容器并注入你需要的任何依赖项。)。

我已经使用重写的“create”函数定义了重写的EntityManager类,并且还重写了“getRepository”函数。在这个函数中,我认为我需要将会话添加到Repository,因为它是在我重写的EntityRepository类上使用“setSession”方法创建的,但我不确定如何实际将会话添加到管理器中第一个位置,因为EntityManager类(Connection $conn, Configuration $config, EventManager $eventManager)的其他构造函数参数在Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension“ormLoad”方法中提供。

我也指定了

doctrine.orm.entity_manager.class: Me\MyBundle\Doctrine\ORM\EntityManager

在我的config.yml文件中。

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

3 个答案:

答案 0 :(得分:3)

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

my_service:
    class: Doctrine\Common\Persistence\ObjectRepository
    factory_service: doctrine # this is an instance of Registry
    factory_method: getRepository
    arguments: [ %mytest.entity% ]

您可以添加calls来调用setSession(作为延期DI):

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

这是你要做的吗?

答案 1 :(得分:1)

我最终得到的东西略有不同:

我使用我的自定义类覆盖了doctrine.orm.entity_manager.class参数,该类简单地使用额外的$session参数扩展了默认类(带有getter和setter),以及被覆盖的create和{{ 1}}函数(返回我的类的实例而不是默认的。

然后我覆盖了getRepository类并实现了一个" getSession"返回的方法

EntityRepository

最后,在一个可以访问实体管理器的自定义事件监听器中,我调用了

$this->_em->getSession();

让我可以访问每个存储库中的会话。

答案 2 :(得分:0)

在Symfony 4+中,您可以将其设置为ServiceEntityRepository,并且通过自动装配,无需进行任何 services.yaml 更改。

namespace App\Repository;

use App\Entity\YourEntity;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Session\SessionInterface;

class YourRepository extends ServiceEntityRepository
{
    private $session;

    public function __construct(ManagerRegistry $registry, SessionInterface $session)
    {
        $this->session = $session;
        parent::__construct($registry, YourEntity::class);
    }

    public function findSomethingUsingSession()
    {
        $someValue = $this->session->get('some_index');
        // ...
    }
}

然后在您的控制器中(例如)

$repository = $this->getDoctrine()->getRepository(YourEntity::class);
$result = $repository->findSomethingUsingSession();

或使用依赖项注入(推荐)

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