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

3

まず、YAML サービスとパラメーターの定義では、@ は別のサービスも参照します。そのため、コードが機能しません。

基本的に、2 つの可能性があります。最初の簡単な方法は、バンドルで相対パスを使用し、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; 
    }
    ...
}

もう 1 つの可能性は、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 に答える