services.yml和同一个包中的文件路径

时间:2012-09-17 12:30:20

标签: symfony

我如何引用services.yml中的数据文件,该文件位于相同或任何包中?

我发送了一个csv文件,我想作为参数注入。
它在我使用直接路径时起作用:

mybundle.data.csv: %kernel.root_dir%/../vendor/mybundle/my-bundle/mybundle/MyBundle/Resources/data/data.csv 

这是非常冗长和不灵活的,因此我正在寻找一个解决方案,如:

data.csv: "@MyBundle/Resources/data/data.csv"

但这不起作用:

  

...依赖于不存在的服务   “mybundle /资源/数据/ data.csv”。

任何想法?

2 个答案:

答案 0 :(得分:4)

@ - 现在支持yaml中的转义

https://github.com/symfony/symfony/issues/4889

您可以像这样使用

data.csv: "@@MyBundle/Resources/data/data.csv"

答案 1 :(得分:3)

首先:在YAML服务和参数定义中,@也指另一个服务。这就是你的代码不起作用的原因。

基本上你有两种可能性。第一个也是最简单的方法是使用捆绑包services.yml中的相对路径并将其附加到CSV类中。

例如:

# src/Acme/DemoBundle/Resources/config/services.yml
parameters:
    data.csv: "Resources/data/data.csv"

在课程中,您要阅读CSV文件:

// src/Acme/DemoBundle/Import/ReadCsv.php
...
class ReadCsv
{
    ...
    public function __construct($csvFile)
    {
       $this->csvFile = __DIR__.'/../'.$csvFile; 
    }
    ...
}

另一种可能性是通过config.yml配置CSV文件的文件名(参见this article in the Symfony2 cookbook)并在您AcmeDemoBundleExtension类中替换的配置值中插入一个特殊的占位符:

// src/Acme/DemoBundle/DependencyInjection/AcmeDemoBundleExtension.php
...
public function load(array $configs, ContainerBuilder $container)
{
    ...
    $container->setParameter('acme_demo.csv_file', str_replace('__BUNDLE_DIR__', __DIR__'./.., $config['csv_file']);
}
...

您的config.yml看起来像是:

# app/config/config.yml
acme_demo:
    csv_file: __BUNDLE_DIR__/Resources/data/data.csv