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'';