¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Symfony 5
  3. Administración de eventos de aplicaciones
Extrait - Symfony 5 Desarrolle sitios web PHP estructurados y eficientes
Extractos del libro
Symfony 5 Desarrolle sitios web PHP estructurados y eficientes Volver a la página de compra del libro

Administración de eventos de aplicaciones

Conceptos y escucha de eventos aplicativos

El event dispatcher es uno de los componentes más sencillos del framework. Sin embargo, se utiliza ampliamente dentro de él y es tan indispensable que forma parte del corazón de Symfony.

El event dispatcher implementa el patrón de diseño Observer. El papel de este design pattern es permitir que varias partes observen el progreso de la ejecución de un procesamiento a través de puntos de anclaje. Dependiendo de los elementos observados en un punto de anclaje determinado, estas diversas partes pueden decidir desencadenar ciertas acciones o, incluso, interactuar con el código observado y todo esto, en torno a un sistema de eventos.

Saber cómo usar el event dispatcher sabiamente contribuye a mejorar en gran medida la calidad de su código, así como su mantenibilidad.

1. Propagar eventos

Como de momento la descripción es bastante teórica, le proponemos descubrir este patrón de diseño a través de un ejemplo.

Imagine a un bloguero que quiere persistir en la base de datos cada nuevo artículo publicado por uno de sus colaboradores, enviar un correo electrónico de agradecimiento al autor y publicar un tweet.

El objetivo no es desarrollar todo el ejemplo, sino que vamos a suponer que hay tres servicios que ya están configurados y permiten realizar estas tareas: pdo, mailer y twitter.

Así es como se vería el controlador:

namespace App\Controller;  
  
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\Httpfoundation\Request;  
use Symfony\Component\Routing\Annotation\Route;  
use Symfony\Component\Mailer\MailerInterface;  
use Symfony\Component\Mime\Email;  
 
  
/**  
 * @Route("/blog")  
 */  
class DefaultController extends AbstractController  
{  
 /**  
 * @Route("/publicar")  
 */  
 public function publicar(Request $request, MailerInterface $mailer) 
 {  
 if ('POST' === $request->getMethod()) {  
 $articulo = $request->request->get('articulo');  
  
 // Registro en la base de datos  
 $this->get('pdo')  
 ->prepare('  
 INSERT INTO articulo...

Eventos del kernel

1. Los diferentes tipos de eventos

El kernel de Symfony propaga varios eventos a lo largo del procesamiento de una consulta:

  • kernel.request: este evento se despacha al inicio del procesamiento de la consulta. Se puede utilizar para devolver una respuesta directamente sin pasar por la fase de enrutamiento, el controlador, etc.

  • kernel.controller: este evento se produce justo antes de que se ejecute el controlador.

  • kernel.controller_arguments: este evento también se produce antes de que se ejecute el controlador. Gracias a él, se pueden modificar los argumentos que se pasan al controlador.

  • kernel.view: el evento kernel.view se distribuye si el controlador no devuelve una instancia del objeto Response.

  • kernel.response: este evento permite modificar el objeto de respuesta que se enviará al cliente. Un ejemplo de uso es el siguiente: en un entorno de desarrollo, Symfony utiliza este evento para añadir la barra de depuración en la parte inferior de la página.

  • kernel.finish_request: cuando las subconsultas cambian el estado de la aplicación, este evento se puede utilizar para restablecer determinados valores. En la práctica, es un evento destinado a que el framework lo utilice internamente, en lugar de que lo hagan los usuarios finales.

  • kernel.terminate: el evento kernel.terminate se despacha después de devolver la respuesta. Este evento es bastante interesante en términos...

Eventos de consola

1. Requisito previo

Para entender este capítulo, es necesaria una buena comprensión de la consola Symfony. Antes de continuar, siéntase libre de revisar los capítulos apropiados (Arquitectura del framework - La consola, y Anexos - Crear un comando para la consola).

2. Eventos

La consola es capaz de desencadenar varios eventos; un total de tres.

El primero, console.command, ocurre antes de que se ejecute un comando. Si se produce una excepción durante el desarrollo del comando, aparece el evento console.exception. El evento console.terminate se genera finalmente después de que se complete el comando.

A continuación, se muestra cómo los diferentes eventos de la consola se pueden integrar en un listener:

namespace App\Listener;  
  
use Symfony\Component\Console\ConsoleEvents;  
use Symfony\Component\EventDispatcher\EventSubscriberInterface;  
use Symfony\Component\Console\Event\ConsoleCommandEvent;  
use Symfony\Component\Console\Event\ConsoleExceptionEvent;  
use Symfony\Component\Console\Event\ConsoleTerminateEvent;  
  
class ConsoleListener implements EventSubscriberInterface  
{    
  public function command(ConsoleCommandEvent $event)  
  {  
    $input = $event->getInput(); // objeto input  
    $output = $event->getOutput(); // objeto output  ...