In der Routing-Konfiguration einer Symfony2-App kann ich auf eine Datei wie die folgende verweisen:
somepage:
prefix: someprefix
resource: "@SomeBundle/Resources/config/config.yml"
Gibt es eine Möglichkeit, auf eine Datei relativ zum Bundle innerhalb eines Controllers oder eines anderen PHP-Codes zuzugreifen? Insbesondere versuche ich, ein Symfony \ Component \ Yaml \ Parser-Objekt zum Parsen einer Datei zu verwenden, und ich möchte nicht unbedingt auf diese Datei verweisen. Im Wesentlichen möchte ich dies tun:
$parser = new Parser();
$config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );
Ich habe die Symfony \ Component \ Finder \ Finder-Klasse ausgecheckt, aber ich glaube nicht, dass ich danach suche. Irgendwelche Ideen? Oder übersehen ich vielleicht einen besseren Weg, dies zu tun?
\InvalidArgumentException
, wenn die Datei nicht gefunden werden kann oder der Name ungültig ist und\RuntimeException
wenn der Name ungültige / unsichere Zeichen enthält.Die Antwort von Thomas Kelley ist gut (und funktioniert!). Wenn Sie jedoch die Abhängigkeitsinjektion verwenden und / oder Ihren Code nicht direkt an den Kernel binden möchten, sollten Sie die FileLocator-Klasse / den FileLocator-Dienst verwenden:
$fileLocator
wird eine Instanz von sein\Symfony\Component\HttpKernel\Config\FileLocator
.$path
wird der vollständige, absolute Pfad zur Datei sein.Obwohl der
file_locator
Dienst selbst den Kernel verwendet, ist die Abhängigkeit viel geringer (einfacher, Ihre eigene Implementierung zu ersetzen, Testdoppel zu verwenden usw.)So verwenden Sie es mit Abhängigkeitsinjektion:
quelle
MyClass
davon ab?". Die aktuelleFileLocator
Implementierung verwendetKernelInterface
, aber wenn sich dies in ZukunftMyClass
ändert, müssen Sie nichts darüber wissen. Außerdem ist jetzt klarer, wasMyClass
wirklich benötigt wird (und weniger Versuchung, es mit anderen Kernelfunktionen zu koppeln). Trotzdem sollte der Konstruktor wahrscheinlichSymfony\Component\Config\FileLocatorInterface
eher verlangen alsSymfony\Component\HttpKernel\Config\FileLocator
. Dann können Sie Ihre eigenen schreiben.Sie können
$container->getParameter('kernel.root_dir')
denapp
Ordner Ihrer Anwendung abrufen und Ihre Verzeichnisse nach der gewünschten Datei durchsuchen.quelle
src/Acme/Bundle/MyBundle
,src/Acme/MyBundle
,vendor/acme/my-bundle/src
und so weiter.Wenn Sie dies in einer Datei tun möchten, die sich in befindet
src/.../SomeBundle/...
, können Sie verwenden__DIR__
Sie den vollständigen Pfad der aktuellen Datei abrufen. Dann fügen Sie IhrenResources/...
Weg dazu gerne hinzuquelle