Dans la configuration de routage d'une application Symfony2, je peux me référer à un fichier comme celui-ci:
somepage:
prefix: someprefix
resource: "@SomeBundle/Resources/config/config.yml"
Existe-t-il un moyen d'accéder à un fichier relatif au bundle dans un contrôleur ou un autre PHP? En particulier, j'essaie d'utiliser un objet Symfony\Component\Yaml\Parser pour analyser un fichier, et je ne veux pas faire référence à ce fichier absolument. Essentiellement, je veux faire ceci:
$parser = new Parser();
$config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );
J'ai vérifié la classe Symfony\Component\Finder\Finder, mais je ne pense pas que ce soit ce que je recherche. Des idées? Ou peut-être que je néglige complètement une meilleure façon de procéder?
En fait, il existe un service que vous pourriez utiliser pour cela, le noyau ($this->get('kernel')
). Il a une méthode appelée locateResource()
.
Par exemple:
$kernel = $container->getService('kernel');
$path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt');
La réponse de Thomas Kelley est bonne (et fonctionne!) Mais si vous utilisez l'injection de dépendances et/ou ne voulez pas lier votre code directement au noyau, vous feriez mieux d'utiliser la classe/le service FileLocator:
$fileLocator = $container->get('file_locator');
$path = $fileLocator->locate('@MyBundle/path/to/file.txt')
$fileLocator
sera une instance de \Symfony\Component\HttpKernel\Config\FileLocator
. $path
sera le chemin absolu complet du fichier.
Même si le file_locator
le service lui-même utilise le noyau, c'est une dépendance beaucoup plus petite (plus facile à remplacer pour votre propre implémentation, utilisez des doubles de test, etc.)
Pour l'utiliser avec l'injection de dépendance:
# 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')
}
}
Vous pouvez utiliser $container->getParameter('kernel.root_dir')
pour obtenir le dossier app
de votre application et parcourir vos répertoires jusqu'au fichier souhaité.
Si vous voulez le faire dans un fichier situé dans src/.../SomeBundle/...
vous pouvez utiliser __DIR__
pour obtenir le chemin complet du fichier actuel. Ajoutez ensuite votre Resources/...
chemin vers ça comme
$foo = __DIR__.'/Resources/config/config.yml';