Dans la configuration de routage d'une application Symfony2, je peux faire référence à 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 code 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 faire cela?
\InvalidArgumentException
, si le fichier est introuvable ou si le nom n'est pas valide, et\RuntimeException
si le nom contient des caractères non valides / dangereux.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, il vaut mieux utiliser la classe / 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
service lui-même utilise le noyau, c'est une dépendance beaucoup plus petite (plus facile à remplacer par votre propre implémentation, utiliser des doubles de test, etc.)Pour l'utiliser avec l'injection de dépendances:
# 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') } }
la source
MyClass
dépend-il?". L'FileLocator
implémentation actuelle utiliseKernelInterface
, mais si cela change à l'avenir, ilMyClass
n'est pas nécessaire de le savoir. De plus, il est maintenant plus clair ce qui aMyClass
vraiment besoin (et moins de tentation de le coupler avec d'autres fonctionnalités du noyau). Cela dit, le constructeur devrait probablement exigerSymfony\Component\Config\FileLocatorInterface
plutôt queSymfony\Component\HttpKernel\Config\FileLocator
. Ensuite, vous pouvez écrire le vôtre.Vous pouvez utiliser
$container->getParameter('kernel.root_dir')
pour obtenir leapp
dossier de votre application et parcourir vos répertoires jusqu'au fichier souhaité.la source
src/Acme/Bundle/MyBundle
,src/Acme/MyBundle
,vendor/acme/my-bundle/src
et ainsi de suite.Si vous souhaitez le faire dans un fichier situé dans,
src/.../SomeBundle/...
vous pouvez utiliser__DIR__
pour obtenir le chemin complet du fichier actuel. Ensuite, ajoutez votreResources/...
chemin à cela comme$foo = __DIR__.'/Resources/config/config.yml';
la source