Foros del Web » Programando para Internet » PHP » Symfony »

[SOLUCIONADO] Configurar Entity listeners de Doctrine en Symfony 2.6

Estas en el tema de Configurar Entity listeners de Doctrine en Symfony 2.6 en el foro de Symfony en Foros del Web. Hola. En este momento necesito crear un Listener para los eventos de Doctrine, tales como postPersist, preUpdate, etc. Buscando en el cookbook de Symfony encontre ...
  #1 (permalink)  
Antiguo 11/04/2015, 12:05
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Configurar Entity listeners de Doctrine en Symfony 2.6

Hola.

En este momento necesito crear un Listener para los eventos de Doctrine, tales como postPersist, preUpdate, etc.

Buscando en el cookbook de Symfony encontre esto: http://symfony.com/doc/current/cookb...listener-class

En esa guia mencionan que una nueva característica de Doctrine permite asignar un Listener por entidad, esto me parece mejor ya que se mantiene el codigo separado, mas ordenado.

Cree la clase Listener y en la entidad especifique (segun el ejemplo),

Código PHP:
@EntityListeners({"UserListener"}) 
La clase UserListener tiene un metodo postPersist donde implemento mi logica.

Pero cuando agrego un nuevo registro no pasa nada, no se ejecuta ese codigo.

Y la cuestion es que talvez o muy seguramente Doctrine no ejecuta la clase Listener por si solo.

Que debo hacer para que esto funcione? Como debo configurar mi Listener?

Gracias.
__________________
Aprendiendo!!!
  #2 (permalink)  
Antiguo 12/04/2015, 13:33
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

El único problema que se me ocurre de momento es que no declararas correctamente la clase como servicio o que no tengas la versión 1.4 del ORM.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 12/04/2015, 14:56
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Hola hhs si tengo la version 1.4, y no he registrado la clase como servicio, pues supongo que de esta menera al ponerle el tag
Código:
doctrine.orm.entity_listener
seguira respondiendo a todas las entidades.
__________________
Aprendiendo!!!
  #4 (permalink)  
Antiguo 13/04/2015, 10:40
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Ok, entonces solo quieres que escuche el Entity. Lo raro es que si ya colocaste el @EntityListeners debe de funcionar a menos que los nombres en los métodos no correspondan o no estas accediendo a la Entidad que crees y por eso no se este ejecutando el Listener.
Puedes publicar el código relacionado ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 13/04/2015, 11:09
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Hola hhs

Esta es la entidad:

Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6.  
  7. /**
  8.  * DetalleGrupo
  9.  *
  10.  * @ORM\Table(name="tb_productos")
  11.  * @ORM\Entity(repositoryClass="AppBundle\Repository\ProductoRepository")
  12.  * @ORM\EntityListeners({"AppBundle\EntityListeners\ProductoListener"})
  13.  */
  14. class Producto
  15. {
  16.     /**
  17.      * @var integer
  18.      *
  19.      * @ORM\Id
  20.      * @ORM\GeneratedValue
  21.      * @ORM\Column(type="bigint")
  22.      */
  23.     private $id;
  24.  
  25.     /**
  26.      * @var string
  27.      *
  28.      * @ORM\Column(type="string", length=100, nullable=false)
  29.      */
  30.     private $nombre;
  31.  
  32.     /**
  33.      * Get id
  34.      *
  35.      * @return integer
  36.      */
  37.     public function getId()
  38.     {
  39.         return $this->id;
  40.     }
  41.  
  42.     /**
  43.      * Set nombre
  44.      *
  45.      * @param string $nombre
  46.      * @return Colegio
  47.      */
  48.     public function setNombre($nombre)
  49.     {
  50.         $this->nombre = $nombre;
  51.  
  52.         return $this;
  53.     }
  54.  
  55.     /**
  56.      * Get nombre
  57.      *
  58.      * @return string
  59.      */
  60.     public function getNombre()
  61.     {
  62.         return $this->nombre;
  63.     }
  64. }

Y esta es la clase listener:

Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\EntityListeners;
  4.  
  5. use AppBundle\Entity\Producto;
  6. use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
  7.  
  8. class ProductoListener
  9. {
  10.     public function postPersist(Producto $producto, LifecycleEventArgs $lifecycleEventArgs) {
  11.         ldd($producto->getId());
  12.     }
  13. }

Segun la doc de Doctrine http://docs.doctrine-project.org/pro...tity-listeners, todo estaria bien.

Gracias por tu ayuda.
__________________
Aprendiendo!!!
  #6 (permalink)  
Antiguo 13/04/2015, 11:36
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Cambia este use:
Código PHP:
Ver original
  1. use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
Por:
Código PHP:
Ver original
  1. use Doctrine\ORM\Event\LifecycleEventArgs;

Obtienes el mismo resultado ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Última edición por hhs; 13/04/2015 a las 11:42
  #7 (permalink)  
Antiguo 13/04/2015, 11:58
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Nada, sigue sin funcionar...

Gracias
__________________
Aprendiendo!!!
  #8 (permalink)  
Antiguo 13/04/2015, 12:01
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Encontre este enlace http://egeloen.fr/2013/12/01/symfony...ner-as-serice/ al parecer no es tan sencillo como agregar la anotacion @EntityListeners en la entidad.
__________________
Aprendiendo!!!
  #9 (permalink)  
Antiguo 13/04/2015, 12:03
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Eso si esta mas raro ya que como lo tienes, debe de responder bien para los dos casos. Deja hago una prueba con tu código
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #10 (permalink)  
Antiguo 13/04/2015, 13:07
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

No es necesario, en symfony 2.6 resuelve el listener como debe de ser. Probé tu ejemplo y si ejecuta el postPersist.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #11 (permalink)  
Antiguo 13/04/2015, 13:10
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Si lo tengo de esta manera:

Cita:
Iniciado por anacona16 Ver Mensaje
Esta es la entidad:

Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6.  
  7. /**
  8.  * DetalleGrupo
  9.  *
  10.  * @ORM\Table(name="tb_productos")
  11.  * @ORM\Entity(repositoryClass="AppBundle\Repository\ProductoRepository")
  12.  * @ORM\EntityListeners({"AppBundle\EntityListeners\ProductoListener"})
  13.  */
  14. class Producto
  15. {
  16.     /**
  17.      * @var integer
  18.      *
  19.      * @ORM\Id
  20.      * @ORM\GeneratedValue
  21.      * @ORM\Column(type="bigint")
  22.      */
  23.     private $id;
  24.  
  25.     /**
  26.      * @var string
  27.      *
  28.      * @ORM\Column(type="string", length=100, nullable=false)
  29.      */
  30.     private $nombre;
  31.  
  32.     /**
  33.      * Get id
  34.      *
  35.      * @return integer
  36.      */
  37.     public function getId()
  38.     {
  39.         return $this->id;
  40.     }
  41.  
  42.     /**
  43.      * Set nombre
  44.      *
  45.      * @param string $nombre
  46.      * @return Colegio
  47.      */
  48.     public function setNombre($nombre)
  49.     {
  50.         $this->nombre = $nombre;
  51.  
  52.         return $this;
  53.     }
  54.  
  55.     /**
  56.      * Get nombre
  57.      *
  58.      * @return string
  59.      */
  60.     public function getNombre()
  61.     {
  62.         return $this->nombre;
  63.     }
  64. }

Y esta es la clase listener:

Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\EntityListeners;
  4.  
  5. use AppBundle\Entity\Producto;
  6. use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
  7.  
  8. class ProductoListener
  9. {
  10.     public function postPersist(Producto $producto, LifecycleEventArgs $lifecycleEventArgs) {
  11.         ldd($producto->getId());
  12.     }
  13. }
Sin ningun service, te funciona?
__________________
Aprendiendo!!!
  #12 (permalink)  
Antiguo 13/04/2015, 13:18
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Cita:
Sin ningun service, te funciona?
Afirmativo, funciona sin problema.
Lo único diferente es que para este tipo de depuración utilizo xdebug, ya que el dump no me arroja valores, no se si pase lo mismo con lady bug.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #13 (permalink)  
Antiguo 13/04/2015, 13:25
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Ok, gracias por tu ayuda hhs

La pregunta ahora es como inyectar servicios a ese Listener...
__________________
Aprendiendo!!!

Última edición por anacona16; 13/04/2015 a las 13:48
  #14 (permalink)  
Antiguo 13/04/2015, 13:54
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Anacona16, Si necesitas hacer eso, entonces requieres lo que te pase antes: http://symfony.com/doc/current/bundl...listeners.html el tema también se vio en stackoverflow: http://stackoverflow.com/questions/2...th-symfony-2-4, la instalación que menciona no es necesaria ya que en symfony 2.6 se instala la versión 1.3 de DoctrineBundle.
Un placer y espero que todo vaya bien
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #15 (permalink)  
Antiguo 13/04/2015, 14:26
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

hhs

Una ultima pregunta (sigue sin funcionar mi código), debo poner algo en al app/config/config.yml?

Gracias.
__________________
Aprendiendo!!!
  #16 (permalink)  
Antiguo 13/04/2015, 14:35
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Para lo del EntityListener no toque nada, pero si vas a agregar la clase como servicio, nada mas recuerda hacer el import de app/config/service.yml
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #17 (permalink)  
Antiguo 13/04/2015, 15:27
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Hola hhs al fin encontre la razon de porque no funcionaba.

Hace unos dias vi este tutorial http://www.craftitonline.com/2015/04...-cache-bundle/ y lo implemente, no se porque pero si esta eso no funciona.

Gracias.
__________________
Aprendiendo!!!
  #18 (permalink)  
Antiguo 13/04/2015, 15:48
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Es curioso, se supone que no te debiera de dar problema al menos en ambientes de desarrollo. Tomare nota gracias por el detalle anacona16
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #19 (permalink)  
Antiguo 13/04/2015, 16:13
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Hola hhs antes de dar por cerrado el tema, una inquietud.

Estoy usando Sonata Admin Bundle en mi proyecto.

Sonata permite también eventos https://sonata-project.org/bundles/a...ing_hooks.html

Crees que debería poner la logia de los eventos prePersist, postPersist, etc, en las clases Admin o lo mejor sera crear una clase Listener para este proposito?

Gracias
__________________
Aprendiendo!!!
  #20 (permalink)  
Antiguo 13/04/2015, 16:44
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Eso depende ya que los eventos de sonata admin se disparan siempre que haces un submit y los de doctrine dependen del estado de los objetos como el caso de la edición; si no hay cambios en la entidad el preUpdate y el postUpdate no se disparan, no utilizo Sonata Admin pero supongo que esos eventos están mas relacionado con los formularios ya que se ejecutan antes o después de la persistencia.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #21 (permalink)  
Antiguo 13/04/2015, 16:55
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: Configurar Entity listeners de Doctrine en Symfony 2.6

Ok, muchas gracias por tu ayuda...
__________________
Aprendiendo!!!

Etiquetas: doctrine, entity, listeners
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:07.