83 votes

Accès aux fichiers liés au paquet dans Symfony2

Dans une Symfony2 de l'application de la configuration du routage, je peux faire référence à un fichier comme ceci:

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

Est-il possible d'accéder à un fichier par rapport au faisceau à l'intérieur d'un contrôleur ou d'un autre code PHP? En particulier, je suis en train d'utiliser Symfony\Component\Yaml\Analyseur objet à 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é le Symfony\Component\Finder\Finder classe, mais je ne pense pas que c'est ce que je suis à la recherche pour. Des idées? Ou peut-être que je suis complètement donnant sur une meilleure façon de faire cela?

179voto

gilden Points 6202

En fait, il existe un service que vous pouvez 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');
 

78voto

fazy Points 345

Thomas Kelley réponse est bonne (et ça marche!) mais si vous êtes à l'aide de l'injection de dépendance et/ou ne voulez pas d'attacher votre code directement dans le noyau, vous êtes mieux de l'aide de l'Introduction de la classe/service:

$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 plein, de chemin d'accès absolu vers le fichier.

Même si l' file_locator service lui-même utilise le noyau, c'est beaucoup moins de dépendance (plus facile à remplacer votre propre mise en œuvre, le test de l'utilisation de doubles, 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\HttpKernel\Config\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')
    }
}

6voto

Reuven Points 2161

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

3voto

prehfeldt Points 839

Si vous voulez le faire dans un fichier situé dans src/.../SomeBundle/... vous pouvez utiliser __DIR__ pour obtenir le chemin complet du fichier actuel. Puis ajoutez votre chemin Resources/... à celui-ci

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X