我们需要在侦听器中访问数据库信息。 我们在service.yml中配置监听器 听众就像:
namespace company\MyBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class RequestListener
{
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function onKernelRequest(GetResponseEvent $event)
{
...
我们如何在onKernelRequest函数中访问doctrine?
我试图从控制器扩展并执行:
$em = $this->getDoctrine()->getEntityManager();
它有效,但我认为这是一种不好的做法。
答案 0 :(得分:27)
您可以注入服务容器。首先更改构造函数以获取EntityManager:
use Doctrine\ORM\EntityManager;
class RequestListener {
protected $em;
function __construct(EntityManager $em)
{
$this->em = $em;
}
//...
}
然后配置您的服务:
#...
services:
foo.requestlistener:
class: %foo.requestlistener.class%
arguments:
- @doctrine.orm.entity_manager
答案 1 :(得分:2)
看起来你正在将服务容器注入到监听器中,所以你可以这样访问Doctrine:
$doctrine = $this->container->get('doctrine');
答案 2 :(得分:2)
如果您的用例允许您直接使用Doctrine事件监听器
#services.yml
qis.listener.contractBundleStatusListener:
class: Acme\AppBundle\EventListener\MyListener
tags:
- { name: doctrine.event_listener, event: postPersist }
您可以从 LifecycleEventArgs 获取实体管理器:
<?php
use Doctrine\ORM\Event\LifecycleEventArgs;
class MyListener
{
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof Foo) {
$entityManager = $args->getEntityManager();
$entityManager->persist($entity);
$entityManager->flush();
}
}
}
答案 3 :(得分:1)
我仍然是Symfony的新手,但您是否尝试将doctrine
服务传递给您的侦听器而不是服务容器?
或者,您已经在传递服务容器,因此它应该像调用$this->container->get('doctrine')
一样简单。另外,前一段时间我在IRC告诉我,通过服务容器通常被认为是不好的做法。最好传递您需要的各项服务。
答案 4 :(得分:0)
我不会将业务逻辑放在监听器上,因为它只用于监听事件。你将如何使用doctrine为听众编写测试...
我将学习访问的东西放到另一个类中,然后在监听器中调用它。
答案 5 :(得分:0)
在symfony 4中,您应该像这样使用依赖注入
{
"latlngs":
[[2.367272,48.662474],[2.36523,48.663373],
[2.360465,48.66607],[2.3557,48.667419],
[2.352978,48.667868],[2.348893,48.669217],
[2.34549,48.671015],[2.342767,48.672813]...]
}