Hola a todos tengo una duda sobre la utilización de event listeners. La primera duda que tengo es si se pueden utilizar sólo para un método o actúa para toda la clase. Otra duda es: ¿puedo cambiar dinámicamente los valores de los parameters
? ¿y como pasaría al event listener por ejemplo un id
?
Gracias.
Respuestas
La primera pregunta no lo acabo de entender. Los listeners se definen mediante clases y al configurarlos dices qué método se ejecuta cuando se produzca un determinado evento.
La respuesta a la segunda pregunta sería: no. No puedes pasar parámetros dinámicos de tipo id
. Puedes hacer cosas dinámicas si usas el componente Expression Language en la configuración del listener. Pero para pasar por ejemplo un id
, lo que tienes que hacer es pasar el manager de Doctrine y hacer la consulta dentro del listener.
@javiereguiluz
Ok gracias sobre la primera pregunta, te explico, una clase por ejemplo usuarioController implementa una clase abstracta que hace referencia a otra clase eventlistener, cuando el usuario usa algun metodo de la clase usuarioController el eventlistener se dispara, la pregunta es si en este controlador hay varios metodos, ¿hay alguna manera de pasarle al event listener el metodo que se ha disparado para en el eventlistner hacer algo dependiendo del método usado?.
El problema que quiero resolver es este, estoy construyendo una aplicación con una administración de varios niveles, al hacer algún CRUD siempre y codificado las IDs que pasaba por GET cuando se hacía algún cambio para que otro usuario no pudiera borrar algo que no le perteneciera solo cambiando el id del navegador. Supuse que Symfony con el tema de las URLs amistosas debería implementar algo para esto, pero no lo e encontrado. Por lo tanto miré y pensé que seria una buena solucion un evento que cuando se realizasen ciertas acciones, recibiera algunos datos y comprobara si ese usuario hacia un peticion correcta.
Ando un poco perdido en como realizar esto si me pudieras aconsejar cual sería la mejor manera de hacerlo. Un saludo.
@link4your
Respecto a la primera pregunta, lo puedes resolver pasando argumentos al objeto asociado al evento que lanzas. Si no tienes eventos propios, puedes usar el evento genérico de Symfony tal y como se explica en este artículo.
Por otra parte, creo que existe una solución mucho más segura, robusta y fácil de implementar para resolver tu problema. Lo que quieres hacer es: impedir que un usuario pueda modificar/borrar información que no le pertenece. Eso se resuelve en Symfony con los security voters.
Si nunca los has utilizado, al principio pueden parecerte un poco raros. Pero todas las aplicaciones profesionales de Symfony los usan y cuando te haces a ellos, ves que son realmente sencillos y potentes. En este artículo los explican y muestran algunos ejemplos parecidos a lo que tu quieres hacer. Por ejemplo: impedir que un usuario pueda modificar un post que no sea suyo: $this->denyAccessUnlessGranted('edit', $post);
@javiereguiluz
Ok gracias le echaré un vistazo a los security voters
@link4your