L'accès aux Fichiers par rapport à l'ensemble de 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 un moyen 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 le faire:
$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?
Vous devez vous connecter pour publier un commentaire.
Comme une question de fait, il y a un service que vous pourriez utiliser pour cela, le noyau (
$this->get('kernel')
). Il a une méthode appeléelocateResource()
.Par exemple:
\InvalidArgumentException
, si le fichier ne peut pas être trouvé ou le nom n'est pas valide, et\RuntimeException
, si le nom contient des invalides/dangereux personnages.@AcmeDemoBundle/path/to/directory
ou vais-je trouver un fichier et de le dépouiller le nom de fichier?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
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 le
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.)De l'utiliser avec l'injection de dépendance:
MyClass
dépend-il?". L'actuelFileLocator
mise en œuvre utiliseKernelInterface
, mais si cela change à l'avenirMyClass
n'a pas besoin de le savoir. Aussi, il est maintenant plus clair ceMyClass
vraiment besoin (et moins de tentation de le coupler avec d'autres fonctionnalités du noyau). Après avoir dit tout cela, le constructeur devrait probablement êtreSymfony\Component\Config\FileLocatorInterface
plutôt queSymfony\Component\HttpKernel\Config\FileLocator
. Ensuite, vous pouvez écrire votre propre.Vous pouvez utiliser
$container->getParameter('kernel.root_dir')
pour obtenir leapp
dossier de votre application, et parcourez votre répertoire jusqu'au fichier que vous voulez.src/Acme/Bundle/MyBundle
,src/Acme/MyBundle
,vendor/acme/my-bundle/src
et ainsi de suite.Si vous voulez le faire dans un fichier situé dans
src/.../SomeBundle/...
vous pouvez utiliser__DIR__
pour obtenir le chemin complet du fichier en cours. Puis ajouter votreResources/...
chemin que comme