4

如何引用 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/resources/data/data.csv”。

有任何想法吗?

4

2 回答 2

4

现在支持 yaml 中的 @-escaping

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

你可以像这样使用它

data.csv: "@@MyBundle/Resources/data/data.csv"
于 2016-08-08T10:51:14.743 回答
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; 
    }
    ...
}

另一种可能性是使 CSV 文件的文件名可通过config.yml(参见Symfony2 食谱中的这篇文章)配置,并在您在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
于 2012-09-17T16:19:15.113 回答