Php 访问Symfony2中与捆绑包相关的文件
在Symfony2应用程序的路由配置中,我可以引用如下文件:Php 访问Symfony2中与捆绑包相关的文件,php,symfony,Php,Symfony,在Symfony2应用程序的路由配置中,我可以引用如下文件: somepage: prefix: someprefix resource: "@SomeBundle/Resources/config/config.yml" 在控制器或其他PHP代码中,是否有任何方法可以访问与捆绑包相关的文件?特别是,我试图使用Symfony\Component\Yaml\Parser对象来解析文件,我不想绝对引用该文件。基本上,我想这样做: $parser=newparser(); $conf
somepage:
prefix: someprefix
resource: "@SomeBundle/Resources/config/config.yml"
在控制器或其他PHP代码中,是否有任何方法可以访问与捆绑包相关的文件?特别是,我试图使用Symfony\Component\Yaml\Parser对象来解析文件,我不想绝对引用该文件。基本上,我想这样做:
$parser=newparser();
$config=$parser->parse(文件获取内容(@SomeBundle/Resources/config/config.yml));
我已经签出了Symfony\Component\Finder\Finder类,但我认为这不是我想要的。有什么想法吗?或者我完全忽略了一种更好的方法?您可以使用
$container->getParameter('kernel.root\u dir')
获取应用程序的应用程序文件夹,然后将目录浏览到所需的文件。如果要在位于src/../SomeBundle/..
的文件中执行此操作,可以使用\uuu DIR\uuu
获取当前文件的完整路径。然后将您的资源/…
路径附加到类似
$foo = __DIR__.'/Resources/config/config.yml';
事实上,有一个服务可以用于此,内核($this->get('kernel')
)。它有一个名为的方法
例如:
$kernel = $container->getService('kernel');
$path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt');
Thomas Kelley的答案很好(而且很有效!),但是如果您使用依赖注入和/或不想将代码直接绑定到内核,那么最好使用FileLocator类/服务:
$fileLocator = $container->get('file_locator');
$path = $fileLocator->locate('@MyBundle/path/to/file.txt')
$fileLocator
将是\Symfony\Component\HttpKernel\Config\fileLocator
的一个实例$path
将是文件的完整绝对路径
即使file\u locator
服务本身使用内核,它的依赖性也要小得多(更容易替代您自己的实现,使用测试双重等等)
要将其与依赖项注入一起使用,请执行以下操作:
# 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')
}
}
正是我要找的$this->get('kernel')->locateResource(@SomeBundle/Resources/config/config.yml”);//工作perfectly@tomtheman5:确保捕获其异常。如果找不到文件或名称无效,此方法将抛出\InvalidArgumentException
,如果名称包含无效/不安全字符,则此方法将抛出\RuntimeException
。希望给您的不仅仅是+1。您如何(如果有的话)在条令实体中使用此方法,而(我认为)不会(或应该)这样做有权访问内核吗?@Morslima查看fazy的答案。观点不错,但是FileLocator会被注入内核接口,所以基本上,如果你注入FileLocator而不是内核,你不会做得更好:)我明白你的观点,我想到了这一点。然而,问题不是“加载/执行了什么代码?”,而是“MyClass依赖于什么代码?”。当前的FileLocator
实现使用KernelInterface
,但是如果将来发生变化MyClass
不需要知道它。而且,现在更加清楚了MyClass真正需要的是什么(并且减少了将它与其他内核特性结合的诱惑)。话虽如此,构造函数可能需要Symfony\Component\Config\FileLocatorInterface
而不是Symfony\Component\HttpKernel\Config\FileLocator
。这样你就可以自己写了。这样更好answer@ruudy“只有具有付费计划的注册用户才能完全访问规则说明。此页面显示了通过订阅可以获得的示例。”我没有付费,我可以查看完整说明以及如何解决此问题的说明。也许你只需要注册。现在我注册了,我可以看到页面了。首先,它说“不应该”和“不应该”。其次,只有当您计划向公众发布代码或计划稍后覆盖资源路径时,这才是重要的。在我的封闭源代码项目中,这不会发生,所以这对我来说并不重要。如果这一点对你很重要,这取决于你将要使用它的上下文。尽管如此,还是要感谢您的提示。如果您遵循建议,您可以模拟路径,或者出于测试目的使用它。我不是英语母语,最好不要使用这个php常量,更不用说像Symfony2这样的框架了。Bundle可以在任何目录下。常见示例:src/Acme/Bundle/MyBundle
,src/Acme/MyBundle
,vendor/Acme/my Bundle/src
等等。