如何从symfony 2.8中的实体侦听器访问实体存储库?


how can i access to the entity repository from a entity listener in symfony 2.8?

我是Symfony 2新手。

我有一个名为"addNewTarjeta"的函数在一个个性化的实体仓库。

<?php
namespace Elkanogroup'ClientesBundle'Repository;
/**
 * ClienteRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ClienteRepository extends 'Doctrine'ORM'EntityRepository {
 /**
     * Asigna una tarjeta a este cliente. 
     */
    public function addNewTarjeta(Cliente $cliente) {
        $tarjeta = new 'Elkanogroup'ClientesBundle'Entity'Tarjeta();
        $tarjeta->setNumeroTarjeta('5555 5555 5555 5555');
        $tarjeta->setCliente($cliente);
        $tarjeta->setFechaExpedicion(new 'DateTime());
        $em = $this->getDoctrine()->getManager();        
        $em->persist($tarjeta);
        $flush = $em->flush();
        if ($flush != null) {
            return false;
        }
        return true;
    }

我有一个监听器等待一个学说事件postPersist。我想从postPersist函数中调用"addNewTarjeta"。

我想做这样的事情:

<?php
namespace Elkanogroup'ClientesBundle'EventListener;
use Doctrine'ORM'Event'LifecycleEventArgs;
use Symfony'Component'DependencyInjection'ContainerInterface;
use Elkanogroup'ClientesBundle'Entity'Cliente;
use Elkanogroup'ClientesBundle'Repository'ClienteRepository;
class ClienteListener {

    public function postPersist(Cliente $cliente, LifecycleEventArgs $args) {

        $cliente->addNewTarjeta($cliente);
    }

但是它不起作用。 Symfony说:

试图调用类的未定义方法addNewTarjeta"实体Elkanogroup ' ClientesBundle ' ' Cliente"。

有谁能帮我吗?谢谢,对不起,我的英语不好。

这里的每个人都说你需要注入实体管理器,但对我来说这不是真的:你可以从LifecycleEventArgs检索它而不注入任何东西。

只做

$args->getObjectManager();

你就完成了。

请注意:通常 repos用于保存自定义查询(通过DQL或纯SQL或查询生成器)。像这样的逻辑应该被安装在服务(管理器、帮助器等)中。

正如@dragoste所说,您需要将entitymanager服务注入到侦听器中。

可以在services.yml中完成:

  name.of.your.listener:
    class: AppBundle'Listener'MyListener
    arguments: ["@doctrine.orm.entity_manager"]

然后,在侦听器中添加public function __construct('Doctrine'ORM'EntityManager $entityManager)方法:

<?php
namespace AppBundle'Listener;
class MyListener
{
  /**
   * @var 'Doctrine'ORM'EntityManager
   */
  private $entityManager;
  public function __construct('Doctrine'ORM'EntityManager $entityManager)
  {
    $this->entityManager = $entityManager;
  }