我想覆盖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类,并将会话注入其中?
答案 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();
// ...
}