En la configuración de enrutamiento de una aplicación Symfony2, puedo hacer referencia a un archivo como este:
somepage:
prefix: someprefix
resource: "@SomeBundle/Resources/config/config.yml"
¿Hay alguna forma de acceder a un archivo relativo al paquete dentro de un controlador u otro código PHP? En particular, estoy tratando de usar un objeto Symfony \ Component \ Yaml \ Parser para analizar un archivo, y no quiero referirme a ese archivo en absoluto. Esencialmente, quiero hacer esto:
$parser = new Parser();
$config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );
Revisé la clase Symfony \ Component \ Finder \ Finder, pero no creo que eso sea lo que estoy buscando. ¿Algunas ideas? ¿O tal vez estoy pasando por alto por completo una mejor manera de hacer esto?
\InvalidArgumentException
, si no se puede encontrar el archivo o el nombre no es válido, y\RuntimeException
si el nombre contiene caracteres no válidos / inseguros.La respuesta de Thomas Kelley es buena (¡y funciona!), Pero si está usando la inyección de dependencia y / o no desea vincular su código directamente al kernel, es mejor que use la clase / servicio FileLocator:
$fileLocator = $container->get('file_locator'); $path = $fileLocator->locate('@MyBundle/path/to/file.txt')
$fileLocator
será una instancia de\Symfony\Component\HttpKernel\Config\FileLocator
.$path
será la ruta completa y absoluta al archivo.Aunque el
file_locator
servicio en sí usa el kernel, es una dependencia mucho más pequeña (más fácil de sustituir por su propia implementación, usar pruebas dobles, etc.)Para usarlo con inyección de dependencia:
# services.yml services: my_bundle.my_class: class: MyNamespace\MyClass arguments: - @file_locator # MyClass.php use Symfony\Component\Config\FileLocatorInterface as FileLocator; class MyClass { private $fileLocator; public function __construct(FileLocator $fileLocator) { $this->fileLocator = $fileLocator; } public function myMethod() { $path = $this->fileLocator->locate('@MyBundle/path/to/file.txt') } }
fuente
MyClass
depende?". LaFileLocator
implementación actual usaKernelInterface
, pero si eso cambia en el futuroMyClass
, no necesita saberlo. Además, ahora está más claro lo queMyClass
realmente necesita (y menos tentación de combinarlo con otras características del kernel). Habiendo dicho todo eso, el constructor probablemente debería requerir enSymfony\Component\Config\FileLocatorInterface
lugar deSymfony\Component\HttpKernel\Config\FileLocator
. Entonces puedes escribir el tuyo propio.Puede usar
$container->getParameter('kernel.root_dir')
para obtener laapp
carpeta de su aplicación y buscar en sus directorios el archivo que desee.fuente
src/Acme/Bundle/MyBundle
,src/Acme/MyBundle
,vendor/acme/my-bundle/src
y así sucesivamente.Si desea hacer eso en un archivo ubicado en
src/.../SomeBundle/...
, puede usar__DIR__
para obtener la ruta completa del archivo actual. Luego agrega tuResources/...
camino a eso como$foo = __DIR__.'/Resources/config/config.yml';
fuente