Symfony 2.1, el libro oficial

4.3. La estructura de directorios

Las secciones anteriores explican la filosofía en la que se basa la creación y procesamiento de páginas en Symfony2. También se ha mencionado cómo están estructurados y organizados los proyectos Symfony2. Al final de esta sección, sabrás dónde encontrar y colocar diferentes tipos de archivos y por qué.

Aunque se puede cambiar, por defecto todas las aplicaciones Symfony tienen la misma estructura de directorios sencilla (y recomendada):

  • app/: contiene la configuración de la aplicación.
  • src/: aquí se encuentra todo el código PHP de la aplicación.
  • vendor/: por convención aquí se guardan todas las librerías creadas por terceros.
  • web/: este es el directorio web raíz y contiene todos los archivos que se pueden acceder públicamente.

4.3.1. El directorio web

El directorio web raíz es el lugar donde se encuentran todos los archivos públicos y estáticos tales como imágenes, hojas de estilo y archivos JavaScript. También es el lugar donde se definen todos los controladores frontales, como por ejemplo el siguiente:

// web/app.php
require_once __DIR__.'/../app/bootstrap.php.cache';
require_once __DIR__.'/../app/AppKernel.php';

use Symfony\Component\HttpFoundation\Request;

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$kernel->handle(Request::createFromGlobals())->send();

El archivo del controlador frontal (app.php en este ejemplo) es el archivo PHP que realmente se ejecuta cuando utilizas una aplicación Symfony2 y su trabajo consiste en arrancar la aplicación utilizando una clase del núcleo (AppKernel).

Truco Tener un controlador frontal significa que se utilizan URL diferentes y más flexibles que las de una aplicación PHP típica. Cuando se dispone de un controlador frontal, las URL se formatean de la siguiente manera:

http://localhost/app.php/hello/Ryan

El controlador frontal, app.php, se ejecuta y la URL interna: /hello/Ryan se dirige internamente según la configuración de enrutamiento.

Si además utilizas el módulo mod_rewrite de Apache, puedes forzar la ejecución del archivo app.php sin necesidad de incluirlo en la URL, por lo que así las URL son todavía más limpias:

http://localhost/hello/Ryan

Aunque los controladores frontales son esenciales para servir cada petición, rara vez los tendrás que modificar o incluso pensar en ellos. Los mencionaremos brevemente de nuevo en la sección dedicada a los entornos de ejecución.

4.3.2. El directorio de la aplicación (app)

Como vimos en el controlador frontal, la clase AppKernel es el punto de entrada principal de la aplicación y es la responsable de toda la configuración. Como tal, se almacena en el directorio app/.

Esta clase debe implementar dos métodos que definen todo lo que Symfony necesita saber acerca de tu aplicación. Ni siquiera tienes que preocuparte de estos métodos durante el arranque — Symfony los rellena por ti con parámetros predeterminados.

  • registerBundles(): devuelve un array con todos los bundles necesarios para ejecutar la aplicación.
  • registerContainerConfiguration(): carga el archivo de configuración de recursos de la aplicación (consulta la sección Configurando la aplicación).

Durante el desarrollo de una aplicación, normalmente el directorio app/ solo los utilizas para modificar la configuración y los archivos de enrutamiento en el directorio app/config/ (consulta la sección Configurando la aplicación).

Este directorio también contiene el directorio caché de la aplicación (app/cache), un directorio de logs (app/logs) y un directorio para archivos de recursos globales, tales como plantillas (app/Resources). Aprenderás más sobre cada uno de estos directorios en capítulos posteriores.

4.3.3. El directorio fuente (src)

En pocas palabras, el directorio src/ contiene todo el código real (código PHP, plantillas, archivos de configuración, estilos, etc.) que pertenece a tu aplicación. De hecho, al programar una aplicación Symfony, la mayor parte de tu trabajo se llevará a cabo dentro de uno o más bundles creados en este directorio.

Pero, ¿qué es exactamente un bundle?