两种解决方案
第一个解决方案(推荐)
将ApiService 设为 symfony2 服务并注入 EntityManager ServiceContainer(避免ServiceCircularReferenceException)(construct injection 或setter injection),以便您可以直接使用它。为此,您还需要将此新服务注入您的事件侦听器。
您可以按如下方式执行此操作(也可以查看 Edit)
1) 将您的ApiService 类设为服务
your_bundle_name.api_service:
class: Path\To\Your\Api\Service\Class
arguments: [@doctrine.orm.entity_manager] #i.e.: constructor injection
2) 修改你的 ApiService 类
<?php
namespace Nick\AlertBundle\Service;
use Doctrine\ORM\EntityManager; //!IMPORTANT
class ApiService
{
protected $em:
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function executeTerminalCommand($entity)
{
$worldspanCommand = $this->em->getRepository("NickAlertBundle:AvailabilityAlert")->getSpecificAlert($entity->getId());
}
}
这可能会导致ServiceCircularReferenceException我的解决方案是更改点1)和2)如下
1) 将您的ApiService 类设为服务
your_bundle_name.api_service:
class: Path\To\Your\Api\Service\Class
arguments: [@service_container]
2) 修改你的ApiService 类
<?php
namespace Nick\AlertBundle\Service;
use Symfony\Component\DependencyInjection\ContainerInterface as Container; //!IMPORTANT
class ApiService
{
protected $sc;
public function __construct(Container $sc)
{
$this->sc = $sc;
}
public function executeTerminalCommand($entity)
{
$em = $this->sc->get('doctrine.orm.entity_manager');
$worldspanCommand = $em->getRepository("NickAlertBundle:AvailabilityAlert")->getSpecificAlert($entity->getId());
}
}
3) 修改您的事件侦听器服务以接受服务容器作为实例化的参数
your_listner_name:
class: Path\To\Your\Listener\Class
arguments: [@your_bundle_name.api_service]
tags:
- { name: doctrine.event_listener, event: postPersist }
4) 修改你的事件监听类
<?php
namespace Nick\AlertBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Nick\AlertBundle\Entity\AvailabilityAlert;
use Nick\AlertBundle\Service\ApiService;
class AvailabilityAlertListener
{
protected $api_service;
public function __construct(ApiService $api_service)
{
$this->api_service = $api_service;
}
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof AvailabilityAlert) {
$this->api_service->addFlightsAction($entity);
}
}
}
第二种解决方案
将服务容器直接注入您的侦听器并让您的ApiService 类接受实体管理器作为参数
你可以这样做
1) 修改您的 ApiService 类以使其接受实体管理器
<?php
namespace Nick\AlertBundle\Service;
use Doctrine\ORM\EntityManager; //!IMPORTANT
class ApiService
{
protected $em:
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function executeTerminalCommand($entity)
{
$worldspanCommand = $this->em->getRepository("NickAlertBundle:AvailabilityAlert")->getSpecificAlert($entity->getId());
}
}
2) 如下修改你的事件监听器类
<?php
namespace Nick\AlertBundle\EventListener;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Nick\AlertBundle\Entity\AvailabilityAlert;
use Nick\AlertBundle\Service\ApiService;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
class AvailabilityAlertListener
{
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if ($entity instanceof AvailabilityAlert) {
$entity_manager = $args->getEntityManager();
$api = new ApiService($entity_manager);
$api->addFlightsAction($entity);
}
}
}