我是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;
}