world tutorial proyecto hello estructura español ejemplos ejemplo crear configurar carpetas php symfony

php - proyecto - symfony 4 tutorial español



Acceso a archivos relativos al paquete en Symfony2 (4)

En la configuración de enrutamiento de una aplicación Symfony2, puedo referirme a un archivo como este:

somepage: prefix: someprefix resource: "@SomeBundle/Resources/config/config.yml"

¿Hay alguna forma de acceder a un archivo relacionado con el 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 sea eso lo que estoy buscando. ¿Algunas ideas? ¿O tal vez estoy pasando por alto una mejor manera de hacer esto?


Como cuestión de hecho, hay un servicio que podría usar para esto, el kernel ( $this->get(''kernel'') ). Tiene un método llamado locateResource() .

Por ejemplo:

$kernel = $container->getService(''kernel''); $path = $kernel->locateResource(''@AdmeDemoBundle/path/to/file/Foo.txt'');


La respuesta de Thomas Kelley es buena (¡y funciona!), Pero si está utilizando inyección de dependencia y / o no quiere vincular su código directamente con el 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 $path completa y absoluta al archivo.

Aunque el servicio file_locator usa el kernel, es una dependencia mucho más pequeña (más fácil de sustituir para su propia implementación, usar dobles de prueba, 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'') } }


Puede usar $container->getParameter(''kernel.root_dir'') para obtener la carpeta de aplicaciones de su aplicación y explorar sus directorios al archivo que desee.


Si desea hacer eso en un archivo ubicado en src/.../SomeBundle/... puede usar __DIR__ para obtener la ruta completa del archivo actual. A continuación, agregue su ruta de Resources/... a eso como

$foo = __DIR__.''/Resources/config/config.yml'';