W konfiguracji routingu aplikacji Symfony2 mogę odwołać się do takiego pliku:
somepage:
prefix: someprefix
resource: "@SomeBundle/Resources/config/config.yml"
Czy istnieje sposób na dostęp do pliku względem pakietu w kontrolerze lub innym kodzie PHP? W szczególności próbuję użyć obiektu Symfony \ Component \ Yaml \ Parser do parsowania pliku i nie chcę odwoływać się do tego pliku absolutnie. Zasadniczo chcę to zrobić:
$parser = new Parser();
$config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );
Sprawdziłem klasę Symfony \ Component \ Finder \ Finder, ale nie sądzę, że tego właśnie szukam. Jakieś pomysły? A może kompletnie pomijam lepszy sposób na zrobienie tego?
\InvalidArgumentException
, jeśli nie można znaleźć pliku lub nazwa jest nieprawidłowa i\RuntimeException
jeśli nazwa zawiera nieprawidłowe / niebezpieczne znaki.Odpowiedź Thomasa Kelleya jest dobra (i działa!), Ale jeśli używasz iniekcji zależności i / lub nie chcesz wiązać swojego kodu bezpośrednio z jądrem, lepiej jest użyć klasy / usługi FileLocator:
$fileLocator = $container->get('file_locator'); $path = $fileLocator->locate('@MyBundle/path/to/file.txt')
$fileLocator
będzie przykładem\Symfony\Component\HttpKernel\Config\FileLocator
.$path
będzie pełną, bezwzględną ścieżką do pliku.Chociaż
file_locator
sama usługa korzysta z jądra, jest to znacznie mniejsza zależność (łatwiej jest zastąpić własną implementację, użyć podwójnych testów testowych itp.)Aby użyć go z iniekcją zależności:
# 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') } }
źródło
MyClass
zależy?”. ObecnaFileLocator
implementacja używaKernelInterface
, ale jeśli to się zmieni w przyszłościMyClass
, nie musisz o tym wiedzieć. Ponadto jest teraz jaśniejsze, czegoMyClass
naprawdę potrzebuje (i mniej pokusy, aby połączyć to z innymi funkcjami jądra). Mimo wszystko konstruktor powinienSymfony\Component\Config\FileLocatorInterface
raczej wymagać niżSymfony\Component\HttpKernel\Config\FileLocator
. Następnie możesz napisać własne.Możesz użyć,
$container->getParameter('kernel.root_dir')
aby uzyskaćapp
folder swojej aplikacji i przeglądać katalogi do żądanego pliku.źródło
src/Acme/Bundle/MyBundle
,src/Acme/MyBundle
,vendor/acme/my-bundle/src
i tak dalej.Jeśli chcesz to zrobić w pliku znajdującym się w
src/.../SomeBundle/...
, możesz użyć,__DIR__
aby uzyskać pełną ścieżkę do bieżącego pliku. Następnie dołącz swojąResources/...
ścieżkę do tego podobnego$foo = __DIR__.'/Resources/config/config.yml';
źródło