Desarrollo rápido de aplicaciones en PHP con Silex (I)

Escrito por Sergio Gómez el . Publicada en Artículos

PHP es uno de los lenguajes más usados para el desarrollo de aplicaciones web y, en general, el sexto entre los más usados en el desarrollo de software en el mundo. Sin duda a ello ha contribuido el hecho de que es software libre, extremadamente sencillo de aprender y muy versátil. Si bien tiene la lacra de ser un lenguaje poco seguro, esto no es estrictamente cierto. Realmente el lenguaje y su API en sí es realmente seguro, el problema radica en la versatilidad que ofrece. Permite hacer las cosas de tantas maneras, que es probable que terminemos por hacerlas mal. Es decir, que la inseguridad no es culpa del lenguaje sino más bien del programador.

Reinventar la rueda

La expresión “reinventar la rueda” según la Wikipedia: “es una expresión que se refiere al fenómeno habitual de necesitar encontrar solución a algunos problemas que seguramente hayan sido resueltos por alguien que se ha enfrentado anteriormente al problema. Reinventar la rueda es una forma de referirse al esfuerzo resuelto miles de veces por otros, y del que nosotros aún no conocemos la solución.”

Cuando estamos empezando a programar, por alguna razón tendemos a intentar desarrollar todo desde cero, posiblemente porque en la carrera no se suele permitir utilizar librerías externas para desarrollar y se pide implementar hasta las funciones más básicas. Pero no debemos olvidar que esas exigencias tienen un fin docente, el de aprender a programar. Una vez que hemos superado esa fase y estamos desarrollando un proyecto, debemos intentar huir de esa costumbre, por la sencilla razón de que es muy probable que cometamos errores que otros ya han cometido y corregido. Y esto es especialmente sensible en PHP, donde un error al leer alguna variable puede acabar con la aplicación o la base de datos comprometida o, peor aún, el servidor completo. Sí, con PHP es muy fácil dispararse en el pie.

Los entornos de trabajo o frameworks

Un framework, ya sea en PHP o en cualquier otro lenguaje, proporciona herramientas básicas (programas, bibliotecas, lenguajes) que nos permiten desarrollar una aplicación de manera estandarizada y bajo algún paradigma de diseño concreto. Al proporcionarnos esas herramientas, nos ahorramos tener que programarlas nosotros y, lo que es más importante, tener que depurarlas en busca de errores. Normalmente, utilizar un framework nos evita que podamos programar mal, o al menos no tan mal como se puede hacer sin uno. Además, los frameworks proporcionan también herramientas para poder hacer pruebas de unidad, o incluso hacer desarrollo orientado a comportamiento (BDD). Las ventajas que proporciona un framework son indiscutibles. Para PHP hay muchos: Symfony, CakePHP, Zend o Yii son algunos de ellos.

¿Desventajas? Pues, que para proyectos pequeños o que tengan que desarrollarse rápidamente, puede que no merezca la pena el esfuerzo de usarlos. Por ejemplo, si tenemos que desarrollar un proyecto de gestión de almacén, con una base de datos relacional con seis o siete entidades, es muy probable que usar un framework sea la mejor decisión. Pero si solo vamos a crear una web con un par de formularios y poco más, o un webservice muy simple, no merece la pena montar toda la infraestructura que suelen necesitar.

Los microframeworks

Nos encontramos en la encrucijada de crear una pequeña aplicación web y no queremos “reinventar la rueda”, pero tampoco queremos tirarnos más tiempo configurando el framework del que nos tiraremos haciendo la página. Aquí entran los microframeworks, mucho más fáciles de utilizar aunque ofrecen menos funcionalidad, al menos en principio. Uno de los más populares es Sinatra, un microframework para Ruby que ha inspirado la creación de muchos otros, como por ejemplo del que vamos a hablar ahora: Silex.

Silex, un microframework basado en Symfony2

Silex está basado en uno de los frameworks más populares de PHP y que ya indiqué antes: Symfony2. Las características más destacables son:

  • Su API es muy sencilla e intuitiva.
  • Es extensible. Silex cuenta con un contenedor de servicios que permite que podamos extender el framework con nuevas librerías, a modo de plugins.
  • Es testeable. Uno de los componentes de Symfony2 con los que cuenta es el llamado HttpKernel, que abstrae la petición del cliente y la respuesta del servidor, con lo que permite hacer test de ambos elementos muy fácilmente.
  • Necesita PHP5.3 para funcionar. Si no conoces esta versión de PHP es mejor que revises las novedades que tiene respecto a las versiones anteriores, puesto que son muchas y muy importantes (namespaces, funciones lambda, late static bindings, entre otras).

Esto es un ejemplo de una aplicación en Silex:

La primera línea es la que cargaría el framework, de la instalación hablaremos más tarde. La segunda, crea una instancia de la clase Application de Silex, que sería la forma de comenzar a usar el framework. La tercera es la parte principal del ejemplo. Se crea una ruta que recibe un parámetro de tipo GET (en el protocolo HTTP). Esto no es más que una dirección del tipo http://miservidor/hello/Sergio por ejemplo; cualquier dirección hacia nuestro servidor que coincida con la ruta que hemos creado activará esa ruta, y el valor del nombre se puede leer (en principio) en el array $_GET[]. Lo siguiente que se hace es vincular esa ruta a una función lambda que recibe el parámetro GET y además se le indica que usará el entorno $app. Dentro de esa función lo que devolvemos es un echo con la frase “Hello $nombre”. Pero si os fijáis usamos una función que trae $app que es escape que elimina la posibilidad de que se inyecte código HTML o Javascript. Un ejemplo muy simple pero que sirve para ver que Silex es muy sencillo de utilizar y que nos va a ahorrar mucho trabajo y a evitar muchos de los típicos errores de programación en PHP.

Composer, el gestor de dependencias de PHP

Hasta el momento, si queríamos usar alguna API externa de PHP (por aquello de lo que hablamos de no reinventar la rueda), teníamos que encargarnos de instalarla tanto a dicha API como a todas sus dependencias. Si ya puede ser un engorro hacerlo una vez, imaginad cada vez que haya que actualizarlas. Para evitar esto surgió un proyecto llamado Composer que no es más que un gestor de dependencias. A través de un archivo de configuración, o de paquetes ya predefinidos, Composer se encarga de descargar, actualizar e instalar todas las librerías que necesitemos. ¿Por qué cuento esto? Porque Silex permite usar Composer para instalarlo, y creedme, no vais a querer hacerlo de otra manera. Así que lo primero es instalar composer:

Ahora, solo tenemos que crear el archivo de dependencias de Composer. En un directorio vacío crearemos un archivo llamado composer.json con el siguiente contenido:

Y por fin, le diremos a composer que se descargue Silex y todas sus dependencias:

Una vez que hemos terminado, se creará un directorio vendor con todas las librerías que necesitamos para poder trabajar con silex, y un archivo llamado autoload.php que es el encargado de incluirnos en el proyecto por nosotros. Si recordáis el ejemplo que vimos antes, es prácticamente lo primero que hacíamos. Así que si creamos un directorio llamado web y ponemos el ejemplo anterior, debería funcionarnos, salvo por el hecho de que vamos a necesitar configurar apache antes. Pero eso para el siguiente artículo, donde comenzaremos a ver cómo trabajar con Silex. Nos leemos en febrero.

Etiquetas: , , ,

Encuéntranos

Última hora en twitter