Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 访问Symfony2中与捆绑包相关的文件_Php_Symfony - Fatal编程技术网

Php 访问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

在Symfony2应用程序的路由配置中,我可以引用如下文件:

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
等等。