Iniciando un proyecto en Symfony 2

Hace unos días me picó la curiosidad por la segunda versión de Symfony. Había oido hablar de la primera pero no terminaba de convencerme y nunca llegué a reunir ganas para meterme a estudiarlo. Me animé con Symfony 2 después de ver un video de las Jornadas de Symfony de 2010. En la última charla se hacía un avance de lo que aportaba Symfony 2 respecto al 1. Entonces todavía estaba en desarrollo. Hoy disponemos de una versión beta mejorada desde entonces. Después de jugar con ella unos días me da la sensación de estar trabajando sobre un entorno tan sólido como flexible. Usando Symfony 2 tengo desde el principio resueltas tareas con las que seguro te encuentras al desarrollar cualquier proyecto.

Para los que es la primera vez que intentamos hacer algo usando el framework, nos encontraremos perdidos entre ficheros que no tenemos ni idea para que sirven. Recomiendo seguir el tutorial oficial paso a paso para ir encontrando el sentido a su estructura de ficheros y a conceptos que deben quedar claros desde el principio, como el de bundle. Para este artículo me he basado en el caso práctico que han explicado allí y al que se debería pegar un vistazo ( o dos o tres) si no se ha hecho ya.

Lo que voy a hacer en este artículo es indicar los pasos básicos que se suelen seguir para iniciar un proyecto sobre Symfony2. Más que nada, para tener a mano una guía rápida para cuando me olvide :)

Preparar ficheros Symfony

Hay que descargar Symfony. Seguramente quieras la versión con vendors.

Descomprimelo todo y haz que el servidor web (o un subdominio o montatelo como quieras) apunte al directorio web

 

Configurar Symfony

Si todo es correcto se podrá cargar la página de configuración config.php. Depende de como esté montado el servidor web, pero la url completa podría ser‘http://localhost/config.php’

Debería cargarse algo como esto:

Con las flechas en rojo numeradas quiero indicar algunos puntos a los que hay que prestar atención.

En el punto 1 se muestra un listado de recomendaciones que sería conveniente seguir. Tal vez nos evitemos posibles futuros problemas.

Atención al punto 2 por que es donde debemos hacer los cambios. Es posible que tengas más de un servidor web, como es mi caso, y por tanto más de un php.ini Conocer su ruta nos irá bien para solucionar un posible error que comentaré más adelante cuando comience a hablar de Doctrine.

Cuando consideremos que podemos continuar, podemos entrar en el enlace del punto 3y seguir los pasos que se nos indique. Nos pedirá los datos de conexión a una base de datos sobre la que trabajará nuestro futuro proyecto. Los datos podremos cambiarlos luego desde ‘app/config.php/parameters.ini’.

 

Crear un bundle

Un bundle es algo que hace algo. Como suena. Nuestro proyecto será un bundle o un conjunto de ellos. Podrá ser un blog, un web service, un plugin… lo que sea que hará algo, lo que sea. ¡Hasta Symfony es un bundle!

Vamos a crear uno. Lo llamaré Colegio. (el típico proyecto demo tonto que no sirve para nada :P)
Para crearlo, nos colocamos en el directorio Symfony y ejecutamos

php app/console init:bundle "DemoColegioBundle" src

Revisión 1: En las últimas revisiones init:bundle ya no se usa en favor de los generadores interactivos. Todo el paso de creación se resumiría a ún solo paso ejecutando lo siguiente

[code]php app/console generate:bundle[/code]

Revisión 2: Al usar los generadores interactivos, Symfony nos preguntará si quiere que dejemos que haga algunos ajustes en el código por nosotros. Si aceptamos, no hará falta hacer tampoco ninguno de los pasos siguientes. ¡Más fácil que nunca! Ver el video

Si ha ido bien, la consola nos devolverá un texto con los pasos que deberiamos seguir para continuar, que comento a continuación.

Registramos nuestro bundle en ‘app/AppKernel.php’ de esta manera
[code]
public function registerBundles()
{
$bundles = array(
// …
new DemoColegioBundleDemoColegioBundle(),
);

// …

return $bundles;
}
[/code]

 

En Symfony es muy sencillo tener separados varios entornos. Por defecto Symfony nos tiene preparados 3: desarrollo (dev), producción (prod) y test (test). Pero no todos están activos. Cada uno dispone de un front controller ubicados en el directorio‘web’. Para poder acceder a nuestra web desde el front controller del entorno de producción deberiamos editar una linea de‘web/app.php’ para que quede
[code]$kernel = new AppKernel(‘prod’, true);[/code]
Editamos el fichero ‘app/autoload.php’ y registramos nuestro namespace. Le indicamos donde guardamos el código del bundle.
[code]
$loader->registerNamespaces(array(
‘Demo’ => __DIR__.’/../src’,
// …
));
[/code]

Crear el routing

Existe un fichero de conficuración ‘app/routing.yml’ que sirve para enrutar las url que nos pida el usuario con diversos controladores que se encargarán de recibir una petición (request) y que el sistema la procese para devolver una respuesta (response). Tanto Request como Response son dos objetos en Symfony. Para nuestro proyecto de demostración ‘Colegio’ podriamos haber pensado,por ejemplo, que la ruta ‘/alumnos’ llamara a un controlador que nos devolviera un objeto Response con el listado con los nombres de todos los alumnos del colegio. Tendremos que añadir pues las siguientes lineas
[code]
alumnos:
pattern: /alumnos
defaults: { _controller: DemoColegioBundle:Alumnos:index }
[/code]

Otra opción más estrucutrada es escribir la configuración de routing dentro de nuestro bundle ‘src/Demo/ColegioBundle/Resources/config/routing.yml’ e incluirlo en el principal con

[code]
Colegio:
resource: “@DemoColegioBundle/Resources/config/routing.yml”
[/code]

Llegados a este punto tendremos montado un controlador principal que recibe las peticiones del usuario y se las entrega a otros controladores para que hagan sus tareas particulares. En nuestro caso crearemos el controlador Alumnos.

 

Crear un controlador

Symfony nos habrá creado ya un controlador por defecto. Haré otro creando la claseAlumnosController en un fichero llamado ‘AlumnosController.php’ en‘src/Demo/ColegioBundle/Controller/’.

Symfony necesita que añadas ciertos sufijos a los nombres para que indiquen que son. Por ejemplo se añade Bundle a Colegio, Controller a Alumnos, Action a los métodos de los controladores…

El fichero podría quedar en un principio algo como esto:

[code]
namespace DemoColegioBundleController;
use SymfonyComponentHttpFoundationResponse;

class AlumnosController
{
public function indexAction()
{
return new Response(‘Página que será devuelta’);
}
}
[/code]

Nota: recordar que es código PHP y ha de marcarse con <?php ?> aunque no esté en los códigos de ejemplo

Hecho todo esto deberíamos obtener el mensaje ‘Página que será devuelta’ de las peticiones a la url (en mi caso) http://localhost:8888/app_dev.php/alumnos (app_dev.php porque uso el entorno de desarrollo, app.php si usara el de producción). Las feas URL se pueden mejorar usando mod_rewrite

Por ejemplo añadiendo lo siguiente a nuestro .htaccess (al que está dentro del directorio web) limpiaremos un poco la url eliminando la necesidad de escribir el app.php

[code]

RewriteEngine On
RewriteRule ^(.*)$ app.php [QSA,L]

[/code]

En unos días pretendo escribir otra guia para preparar una base de datos sobre la que trabajar en nuestro bundle y crear los modelos. Después lo haré sobre como crear una vista usando las plantillas twig que incorpora Symfony.

Espero que tanto a mi como a cualquiera que esté empezando con Symfony esta guia le sirva para algo.