El contenedor de Symfony ya no utiliza rutas de archivo absolutas

La primera vez que ejecutas una aplicación Symfony, se generan varios archivos en la caché para mejorar su rendimiento. Uno de esos archivos se llama app/cache/dev/appDevDebugProjectContainer.php (en producción, app/cache/prod/appProdProjectContainer.php) y contiene el código PHP completo del contenedor de servicios de Symfony, incluyendo todos sus parámetros y servicios. También existen otros archivos relacionados, como por ejemplo appDevDebugProjectContainerCompiler.log, que contiene información sobre cómo se compila el contenedor de servicios.

Si abres el archivo compilado del contenedor, verás que todas las rutas de archivos que contiene son absolutas. Teniendo en cuenta que el contenedor se regenera automáticamente cada vez que hace falta, las rutas absolutas no parece que sean un gran problema. Sin embargo, las rutas absolutas introducen varias limitaciones.

La principal limitación es que, cuando pasas tu aplicación a producción, no puedes por ejemplo pregenerar la caché en otro directorio antes de activar la nueva versión. Lo mismo sucede si intentas hacer chroot de la aplicación Symfony. Desde ayer, esta limitación desaparece para siempre en todas las nuevas versiones de las ramas 2.3, 2.5, 2.6, 2.7 y 3.0.

Si actualizas hoy mismo a la última versión de alguna de esas ramas, verás la diferencia. En mi caso por ejemplo, cuando ejecutaba symfony.es en local, uno de los servicios del contenedor tenía este aspecto:

protected function getAnnotationReaderService()
{
    return $this->services['annotation_reader'] = new \Doctrine\Common\Annotations\FileCacheReader(new \Doctrine\Common\Annotations\AnnotationReader(), '/Users/javier/sf/symfony.es/app/cache/dev/annotations', true);
}

La misma aplicación con la versión más reciente de Symfony tiene la siguiente pinta:

protected function getAnnotationReaderService()
{
    return $this->services['annotation_reader'] = new \Doctrine\Common\Annotations\FileCacheReader(new \Doctrine\Common\Annotations\AnnotationReader(), (__DIR__.'/annotations'), true);
}

Obviamente no todos los cambios son tan triviales como poner __DIR__. Si fuera así, este problema ya se habría solucionado hace mucho tiempo con un simple reemplazo de cadenas de texto. La solución por la que han optado se basa en expresiones regulares y puedes echar un vistazo a su contenido en el Pull Request 12784 creado por Nicolas Grekas.

Comentarios

  1. Esta mejora se podria ver como muy beneficiosa para el despliegue de apps SF dentro de google app engine?

    Hely Suarez Marin el 6 de diciembre de 2014, 4:41:01

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

4 de diciembre de 2014

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.