【问题标题】:how can i access to the entity repository from a entity listener in symfony 2.8?如何从 symfony 2.8 中的实体侦听器访问实体存储库?
【发布时间】:2017-01-12 17:13:01
【问题描述】:

我是 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\Entity\Cliente”。

谁能帮帮我??感谢和抱歉我的英语不好。

【问题讨论】:

  • 您需要将教义注入您的侦听器类。
  • 谢谢,我是初学者,我该怎么做?
  • 就像 Oscar Pérez 在他的回答中所展示的那样。 ;-)
  • 您也可以阅读文档...

标签: php symfony doctrine-orm listener


【解决方案1】:

正如@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;
  }

【讨论】:

  • 感谢您的回答,但它对我不起作用。现在 symfony 说: 类型错误:传递给 Elkanogroup\ClientesBundle\EventListener\ClienteListener::__construct() 的参数 1 必须是 Elkanogroup\ClientesBundle\EventListener\Doctrine\ORM\EntityManager 的一个实例,没有给出,在 /home/silken/ 中调用vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/DefaultEntityListenerResolver.php 在第 73 行
  • 您是否修改了文件services.yml?您是使用yml 还是xml 来描述服务?
  • 不管他做什么,都行不通。你会得到一个循环依赖错误,因为管理器依赖于它的监听器。试试吧。请务必正确标记侦听器。
  • 是的。我修改了它。我正在使用 yml。谢谢。
  • 正如@Cerad 所说,你会得到一个循环依赖错误。改用 DonCallisto 回答,请原谅我的错误回答
【解决方案2】:

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

做事

$args->getObjectManager();

你就完成了。

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

【讨论】:

  • 感谢您的回复。我试图这样做,但 symofny 的请求是一样的。将函数插入实体类它的工作,但我想它不正确。
  • 感谢@DonCallisto!你是对的!我访问实体管理器: $em = $args->getEntityManager();并使用我需要的方法 $repository = $em->getRepository('ElkanogroupClientesBundle:Cliente'); $repository ->addNewTarjeta();谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多