Crear un proyecto con Silex

En esta ocasión vamos a hablar de Silex, el micro-framework de PHP basado en componentes de Symfony, veremos cómo instalarlo, información básica, sus partes y nos crearemos un proyecto al igual que hicimos con Symfony2 en el que iremos incorporando cosas conforme vayamos escribiendo artículos.

Introducción

Silex es un micro-framework para PHP 5.3 cuya base son varios de los componentes de Symfony2 y Pimple (un pequeño contenedor de dependencias). Con Silex podemos hacer aplicaciones pequeñas y medianas de forma rápida y obteniendo un resultado muy bueno, es mucho más fácil de aprender y usar que Symfony2. Aunque en un principio faltaba documentación esto poco a poco está mejorando, en libroweb.es está la documentación traducida al español y en symfony.es hay una introducción y transparencias de Javier Eguiluz muy recomendable.

Otro punto interesante de los micro-frameworks, en mi opinión, es que sirven para que desarrolladores que aún usan PHP a pelo o sus propios sistemas empiecen a probar cosas nuevas, no sólo su forma, que vean alternativas, cómo se resuelven los problemas que ellos han estado resolviendo para al final aprender, comparar y si lo deciden, empezar a usarlo normalmente.

Usar Silex es muy sencillo, teniéndolo instalado, para verlo funcionando sólo hace falta este código:

Si accediéramos a este fichero vía servidor podríamos ir al path “/hello/ShowMeTheCode” y mostraría por pantalla: Hello ShowMeTheCode. Esto es lo más básico, a partir de aquí habría que ir añadiéndole cosas según las necesidades, esas cosas de las que hablaba en el caso de ser reutilizables en distintos proyectos se llaman Providers, por defecto Silex lleva varios providers para integrar librerías y componentes comunes como son Doctrine (sólo DBAL), Twig, Validator, Forms, etc. Luego veremos cómo registrarlos.

Instalación

Además de la posibilidad de instalar sólo Silex, podemos usar, como comenta Javier, una mejor alternativa que es instalar Silex-Skeleton, que es la configuración por defecto que usa Fabien Potencier y que en lugar de ser un único fichero, se divide en varios, teniendo el código más organizado. Además dispone de entorno de producción y desarrollo y recientemente se ha incorporado la barra de depuración (Profiler). Una vez instalado haremos un repaso a todo lo que lleva.

Instalar con Composer es muy sencillo, sólo hay que ejecutar:

Configuración

Tenemos el proyecto ya descargado en nuestro directorio, primero configuramos el servidor añadiendo un virtuahost o creando el directorio bajo una ruta accesible vía web, en nuestro caso usamos virtualhost y lo llamaremos showmethecode.local para seguir los ejemplos. Sólo nos queda darle permisos a cache y logs.

Accediendo a http://showmethecode-silex.local/index.php ya debería funcionarnos.

Silex-skeleton

Si todo ha ido bien es el momento de hacer un repaso a lo que lleva Silex-Skeleton, para entrar más en detalle del funcionamiento de Silex se recomienda seguir la documentación.

Antes de meternos con código, la estructura de directorios es la siguiente:

  • cache: Directorio donde se almacenará la caché en principio de Twig y el Profiler.
  • config: Aquí estará la configuración específica de cada entorno de desarrollo, por defecto desarrollo y producción.
  • logs: Ficheros de log.
  • src: Código de la aplicación.
  • templates: plantillas de Twig.
  • web: directorio accesible vía web, estarán los controladores frontales y los assets.

Para ver cómo funciona empezaremos en el sentido natural de la petición, entonces vamos a los controladores que se encuentran dentro de la carpeta web, ahí nos encontramos con dos controladores frontales:

  • index.php
  • index_dev.php

Como cabe esperar index.php es el controlador frontal de producción e index_dev.php es el de desarrollo, ambos controladores cargan el autoload.php generado automáticamente por composer y finalmente cargan 3 ficheros,  el controlador frontal de desarrollo también activa el registro de excepciones para mostrarlas y nosotros le añadiremos las líneas de código de Symfony para que sólo tengan acceso desde localhost y las IPs que le indiques, quedando así:

Los 3 ficheros que cargan los controladores por orden son:

  • src/app.php
  • config/dev.php y config/prod.php
  • src/controllers.php

app.php

Es donde está la configuración de la aplicación, donde se registran los servicios, providers, lo que sea a nivel de aplicación y para cualquier entorno (desarrollo o producción), esto es lo que contiene:

Como vemos crea la aplicación y registrar los siguiente Providers:

  • UrlGeneratorServiceProvider: Provee el servicio que se encarga de generar URL para rutas con nombre.
  • ValidatorServiceProvider: Provee el servicio de validar datos, es muy común usarlo con formularios y también existe el FormServiceProvider, pero el validador también tiene su sentido por separado y más en Silex  para validar datos cuando se monta una API.
  • ServiceControllerServiceProvider: Este provider permite crear fácilmente clases Controller para organizar mejor los controladores conforme crece la aplicación, aprovechar la inyección de dependencias y hacerlos más independientes de Silex, pudiendo en un futuro ser llevados a otra aplicación como Symfony2.
  • TwigServiceProvider: Este provider se encarga de integrar la librería Twig.

Para registrar un provider se hace mediante el método register de Application y como primer parámetro recibe la instancia del provider y como segundo acepta un array de pares clave valor que sobrescribirá parámetros anteriormente declarados (lo ideal es sobrescribir parámetros que define el provider), esto se puede ver en el código anterior cuando se registra TwigServiceProvider.

config/prod.php

En este fichero está la configuración específica para producción, por defecto está vacío, pero aquí por ejemplo se podría activar el HttpCacheProvider.

config/dev.php

En este fichero está la configuración de desarrollo:

Como vemos carga primero la configuración de producción, activa el modo debug (con este parámetro podremos luego saber en qué modo estamos), registra MonologServiceProvider para guardar el log. Finalmente carga la barra de depuración y registra la ruta necesaria para visualizarla.

src/controllers.php

Este es el último fichero que importa, aquí registraremos todas las rutas de la aplicación:

Cómo vemos tenemos declarada un ruta por defecto y un manejador de errores que mostrará unas páginas específicas en caso de error.

Con todo esto ya tenemos el objeto app con todo lo necesario, volvemos al controlador frontal y finalmente ejecuta la llamada al método run.

Conforme lo hemos dejado, hemos añadido Foundation y lo hemos subido a un nuevo repositorio en Github y está disponible en la dirección:

silex.showmethecode.es