web-dev-qa-db-fra.com

Accès aux fichiers relatifs au bundle dans Symfony2

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?

83
Thomas Kelley

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');
179
gilden

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')
    }
}
78
fazy

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é.

6
Reuven

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