Eventos en Symfony2

Este artículo es un resumen práctico-recordatorio de lo necesario para implementar eventos en un Bundle de Symfony2. Para una guía detallada recomiendo visitar este enlace o la doc oficial.

Si te tenemos el Bundle Acme/DemoBundle:

  1. Crear la clase Acme/DemoBundle/DemoEvents.php donde se definirán las constantes con el nombre de los diferentes eventos
  2. Crear la carpeta Acme/DemoBundle/Event. Aquí se almacenarán las clases que representan los eventos, por ejemplo MyActionEvent.php. La clase tendrá que recibir en el constructor las clases con las que el Listener trabajará.
  3. Crear la carpeta Acme/DemoBundle/EventListener. Aquí se guardarán las clases que hacen el trabajo lógico que realmente queremos implementar. Serán los Listeners o los Subscribers. Por ejemplo, Acme/DemoBundle/SendEmailListener.php. La clase implentará métodos.
  4. Definir el Listener como servicio en Acme/DemoBundle/Resources/config/listeners.yml.
  5. Lanzar el Evento desde donde se necesite (un controlador, un manager, etc…) utilizando el servicio EventDispatcher.

Hay muchos matices dependiendo si se utiliza un Listener o un Subscriber.

Crear variables $_SERVER desde nginx

nginx permite insertar variables $_SERVER en php con un código como este:

location ~ \.(php|inc)$ {

    fastcgi_param COUNTRY_CODE at;

    fastcgi_pass unix:/tmp/php5-fpm.sock;
    fastcgi_read_timeout 300;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi_params;
}

Muy útil para inyectar variables y así preparar diferentes entornos para Behat.

Entendiendo las clases de PHP Reflection

ReflectionMethod

Esta clase permite llamar a métodos de una clase de manera dinámica. Imaginemos que tenemos una clase Manager con dos métodos:

class Manager
{
    metodoHola()
    {
        echo 'Hola';
    }
 
    metodoAdios()
    {
        echo 'Adios';
    }
}

Si queremos llamar a los métodos de la clase Manager de forma dinámica, en función de un parámetro, la clase ReflectionMethod nos permite hacerlo:

$reflectionMethod = new \ReflectionMethod('Manager', 'metodo'.ucfirst($variable));
$reflectionMethod->invoke($manager);

En el anterior ejemplo, si $variable = 'hola', al ejecutar $reflectionMethod->invoke($manager) ejecutaríamos el método metodoHola. Si en cambio fuese $variable = 'adios' llamaríamos a metodoAdios.

Crear entidades en Doctrine desde el mapping

Generar todas las entidades para un Bundle concreto:

php app/console doctrine:generate:entities MyMainBundle --path="./src"

Generar una entidad concreta

php app/console doctrine:generate:entities MyMainBundle:MyEntity --path="./src"

Cuando se ejecuta el comanda y tiene que generar una Entidad ya existente, generará un backup de esa clase antes de modificarla. En el nuevo archivo se definirán los nuevo atributos y los nuevos métodos getters y setters. Probablemente la función __construct() no la tocará.