Compartiendo conocimiento y experiencias

Los comportamientos en Symfony (Behaviors)

categoría:

Los comportamientos en Symfony es una funcionalidad muy interesante que nos puede ayudar a simplificar y reutilizar nuestro código. Cuando por ejemplo tenemos que escribir dos veces el mismo método para varias clases del modelo, es la situación ideal para utilizar los behaviors. Los behaviors ofrecen una forma simple de extender varias clases del modelo de la misma forma, ya sea alterando métodos existentes o añadiendo nuevos. Permite simular herencia múltiple en PHP, como sabéis en PHP no existe la herencia múltiple, pero en Symfony, los behaviors nos proporciona un mecanismo que nos permite tener herencia múltiple.

¿Como funcionan los behaviors en Symfony?

Los behaviors pueden utilizar de dos formas diferentes:

  • Se pueden añadir “ganchos al modelo”. Esto consiste ejecutar un método de otra clase cuando ocurre un evento, por ejemplo antes de salvar los datos de un objeto del modelo. Estos son los ganchos que proporciona Symfony:

    // Ganchos añadidos a la clase base de objeto
    [nombreClase]:delete:pre // antes de la eliminación
    [nombreClase]:delete:post // después de la eliminación
    [nombreClase]:save:pre // antes de salvar
    [nombreClase]:save:post // después de salvar
    [nombreClase]:[nombreMetodo] // dentro de __call() (permite nuevos métodos)

    // Ganchos añadidos a la clase base Peer
    [NombreClasePeer]:doSelectRS:doSelectRS
    [NombreClasePeer]:doSelectJoin:doSelectJoin
    [NombreClasePeer]:doSelectJoinAll:doSelectJoinAll
    [NombreClasePeer]:doSelectJoinAllExcept:doSelectJoinAllExcept
    [NombreClasePeer]:doUpdate:pre
    [NombreClasePeer]:doUpdate:post
    [NombreClasePeer]:doInsert:pre
    [NombreClasePeer]:doInsert:post

  • Se pueden añadir nuevos métodos. Este es un gancho especial que se debe tratar de forma especial, que hace posible la adición de nuevos métodos en tiempo de ejecución.

Symfony dispone una clase utilitaria, llamada sfPropelBehavior, la cual nos permite trabajar con los comportamientos de forma sencilla.

Lo primero para utilizar un comportamiento en Symfony es declarar dicho comportamiento

  1. // en config/config.php
  2. sfPropelBehavior::registerHooks('media', array(
  3.   ':save:pre'=> array('MediaBehavior', 'preSave')
  4. ));

Después hay que registrar el comportamiento en todas las clases del modelo que lo vayan a utilizar. Estas declaraciones se colocan al final del fichero que contiene la clase del modelo a la que se le quiere añadir el comportamiento.

  1. // en lib/model/Noticias.php
  2. sfPropelBehavior::add('Noticias', array('media'));
  3.  
  4. // en lib/model/Enlaces.php
  5. sfPropelBehavior::add('Enlaces', array('media'));

El primer parametro del metodo sfPropelBehavior::add en el nombre de la clase del modelo al que añadimos el comportamiento y el segundo es un array con en nombre del gancho que se ha declarado.

Para que todo esto funcione tenemos que declarar la clase que se llama desde el gancho. La clase MediaBehavior

  1. class MediaBehavior {
  2.    public function preSave($object, $con = null)
  3.    {
  4.       $object->setTitulo("ESTO ES UN PRUEBA DE UN BEHAVIOR");
  5.    }
  6. }

En conclusión este comportamiento lo que hace es modificar el valor del atributo titulo de las clases del modelo que lo utilizan.

Para terminar todo esto se podría incluir en un plugin para poder reutilizarlo en futuros proyectos. Para ello podríamos organizar el plugin de la siguiente forma:

plugins/
  myPropelMediaBehaviorPlugin/
    lib/
      MediaBehavior.php // la clase que contiene los métodos para ser mezclados (*mixed in*)
    config/
      config.php // registrar los métodos del comportamiento

Como podéis ver la utilización de comportamientos en Symfony es muy sencilla. Además os recomiendo que antes de desarrollar un comportamiento desde cero, reviséis los que hay disponibles en los plugin oficiales de Symfony, ya que podeis encontraros con algo parecido a lo que esteis internando realizar.

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato


CAPTCHA
Esta pregunta se hace para comprobar que es usted una persona real e impedir el envío automatizado de mensajes basura.
CAPTCHA de imagen
Enter the characters shown in the image.

Comentarios recientes

Apoyamos

Drupal Association

Drupalcamp Bacelona 2010

Cáceres 2016