Ver índice de contenidos del libro

17.3. Utilizando componentes de otros frameworks

Si se requiere utilizar una clase externa y no se copia esa clase en algún directorio lib/ de Symfony, la clase se encontrará en algún directorio en el que Symfony no la puede encontrar. En este caso, si se utiliza esta clase en el código, es necesario incluir manualmente una instrucción require, a menos que se utilicen las propiedades de Symfony para enlazar y permitir la carga automática de otros componentes externos.

Symfony de momento no proporciona utilidades y herramientas para resolver cualquier tipo de problema. Si se necesita un generador de archivos PDF, una API para interactuar con los mapas de Google o una implementación en PHP del motor de búsqueda Lucene, es necesario hacer uso de algunas librerías del framework de Zend (http://framework.zend.com/). Si se quieren manipular imágenes directamente con PHP, conectarse con una cuenta POP3 para obtener los emails o diseñar una interfaz para la consola de comandos, seguramente se utilizarán los eZcomponents (http://ez.no/ezcomponents). Afortunadamente, si se utilizan las opciones correctas, se pueden utilizar directamente en Symfony todos los componentes de estas librerías externas.

Lo primero que hay que hacer es declarar la ruta al directorio raíz de cada librería, a menos que se hayan instalado mediante PEAR. Esta configuración se realiza en el archivo settings.yml.

.settings:
  zend_lib_dir:   /usr/local/zend/library/
  ez_lib_dir:     /usr/local/ezcomponents/

A continuación, se configura la carga automática de clases para especificar las librerías que se deben utilizar cuando la carga automática falla en Symfony:

.settings:
  autoloading_functions:
    - [sfZendFrameworkBridge, autoload]
    - [sfEzComponentsBridge,  autoload]

Esta opción es diferente a las reglas definidas en el archivo autoload.yml (el capítulo 19 contiene más información sobre este archivo). La opción autoloading_functions especifica las clases utilizadas como enlace o puente, mientras que el archivo autoload.yml especifica las rutas y reglas utilizadas para buscar las clases. A continuación se describe lo que sucede cuando se crea un nuevo objeto de una clase que no ha sido cargada:

  1. La función de Symfony encargada de la carga automática de clases (sfCore::splAutoload()) busca la clase en las rutas especificadas en el archivo autoload.yml.
  2. Si no se encuentra ninguna clase, se invocan uno a uno los métodos declarados en la opción sf_autoloading_functions hasta que uno de ellos devuelva el valor true.
  3. sfZendFrameworkBridge::autoload()
  4. sfEzComponentsBridge::autoload()
  5. Si todos los métodos anteriores devuelven false, si se utiliza una versión de PHP 5.0.X Symfony lanza una excepción indicando que la clase no existe. Si se utiliza una versión de PHP 5.1 o superior, el propio PHP genera el error.

De esta forma, los componentes de otros frameworks pueden aprovecharse también del mecanismo de carga automática de clases, por lo que es incluso más sencillo que utilizarlos dentro de los frameworks originales. El siguiente código muestra por ejemplo cómo utilizar el componente Zend_Search (que implementa el motor de búsqueda Lucene en PHP) desde el propio framework Zend:

require_once 'Zend/Search/Lucene.php';
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
...

Utilizando Symfony y el enlace con el framework Zend, es mucho más fácil utilizar este componente:

$doc = new Zend_Search_Lucene_Document(); // The class is autoloaded
$doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
...

Los enlaces o puentes disponibles se guardan en el directorio $sf_symfony_lib_dir/addon/bridge/.