Comparte en Facebook Twitter Google+

symfony-estructura-de-directorios

Continuamos con nuestra serie introductoria a Symfony, si ya has trabajado con otros frameworks seguro sabes que la mayoría de ellos aplica la norma de convención sobre configuración, Symfony no es diferente, aunque por su naturaleza define muchas más cosas en archivos de configuración que otros frameworks, pero esto viene con una increíble ventaja, atomicidad a su máxima expresión. Veamos a continuación como está estructurado un proyecto en Symfony, para ello usaremos la app demo que instalamos en el primer post.

imagen-estructura-directorios

Esta es la estructura de archivos que viene por defecto con el framework, como todo en Symfony, esto puede ser modificado a medida de manera muy elegante y simple. Por el momento, concentrémonos en entender donde están ubicados los recursos de nuestra app_demo.

  • app.
    • cache.
    • logs.
    • config: Archivos de configuración globales (rutas por ejemplo).
    • Resources: Vistas globales como layouts, recursos públicos globales también.
      • views: Layouts.
      • public: recursos públicos globales (css, javascript, imágenes)
        • css
        • javascript
        • images
  • src: Bundles específicos de aplicación.
    • NombreOrg
      • NombreBundle
        • Command: Comandos de  consola
        • Controller: Controladores
        • Form : Clases formularios
        • Entity : Clases de entidades (parte del modelo)
        • Twig: Extensiones de Twig
        • EventListener: Eventos de Symfony o de Doctrine
        • Resources
          • views: Vistas
          • config: Configuraciones (rutas por ejemplo)
          • public
            • css
            • javascript
            • images
  • vendor: Bundles reutilizables
  • web: Controlador frontal (app.php, app_dev.php) y recursos públicos.

Como podemos observar un bundle busca ser una mini aplicación en sí mismo, por eso cada bundle tiene sus propios directorios donde guardar sus archivos de estilos, y sus scripts de JavaScript , al igual que sus entidades, controladores y vistas, de hecho hasta sus propios archivos de configuración, la estructura que se plantea en este post obedece a las convenciones para el nombramiento de bundles que se pueden encontrar en la documentación oficial de Symfony, fíjate en la estructura de tu app demo, tenemos.

  • AppBundle: Nombre descriptivo del bundle.
    • Command (Si aquí debes colocar tus comandos de cónsola)
    • Controller

Ahora, seguro te estás preguntando como Symfony carga tus recursos públicos (CSS, JavaScript) para que el navegador sepa donde buscarlos: esta tarea está designada al AsseticBundle, veamos el apartado de configuración de éste en el archivo app/config/config.yml

Fíjate en la llave bundles: [], aquí por defecto el bundle Assetic carga todos los bundles registrados en  la clase AppKernel que se encuentra definida en el archivo app/AppKernel.php

Fíjate en la definición del método registerBundles, este método solo carga un arreglo con las instancias de todos los bundles que van a estar funcionando en nuestra app, nota que AsseticBundle está siendo registrado en esta clase, entonces básicamente Assetic se encarga de leer los archivos definidos en las carpetas Resources/public/* de tus bundles y exportarlos a la carpeta /web/bundles/* para cada bundle respectivamente.

Como mencioné anteriormente algunos de los directorios de la estructura por defecto pueden ser cambiados, por ejemplo algunas veces se pudiera presentar el caso de querer cambiar los directorios destinos de la cache y del log, para esto solo necesitamos saber un poco de programación orientada a objetos, de seguro notaron que la clase AppKernel extiende de Kernel, si somos curiosos y revisamos la fuente de la clase Kernel, podemos encontrar estos dos métodos.

Como podemos ver son dos métodos públicos que puedes sobrescribir en la clase AppKernel ya que ésta hereda de la clase Kernel.

Ahora si deseamos cambiar el directorio web, primero necesitaríamos cambiar el valor symfony-web-dir de tu composer.json.

Luego tenemos que señalarle a Assetic donde esta nuestro nuevo directorio público.

Después de hacer estos cambios necesitas reconstruir la cache de tu aplicación, asegurate de correr estos comandos primero.

También podemos cambiar el directorio /vendor de nuestra app, igual que con el directorio web debemos primero cambiar el valor que se encuentra en el archivo composer.json.

Recordemos que composer nos genera un autoload.php que se encarga de cargarnos las clases de nuestro directorio vendor, debemos incluir a este archivo desde el archivo app/autoload.php

En Symfony podemos cambiar de hecho cualquiera de los directorios, no digo que con otros frameworks no se pueda; pero Symfony al ser concebido para ser lo mas atómico y modular posible te hace este trabajo mas fácil, claro que nunca es recomendable romper con las convenciones a menos que sea un caso estrictamente necesario (tendría que ser que tu vida dependa de ello), pero si llegara ese caso, para cambiar o renombrar el directorio src deberás modificar el valor respectivo en tu composer.json

Listo ya cambiaste el directorio src donde toda persona en buen uso de sus facultades definiría sus bundles, ahora que rompiste con las convenciones no te olvides de comentar todo lo posible en los archivos correspondientes, sino la mafia rusa será la menor de tus preocupaciones (el próximo desarrollador que haga mantenimiento a tu código, te hará pagar tu sacrilegio)

Aprende PHP, Laravel y más por sólo 999 al mes: ver planes.

Lección anterior Introducción, instalación y fundamentos de Symfony Lección siguiente Introduccion a Symfony III, Ambientes de desarrollo