4

シナリオ:

  • 依存性注入コンポーネントをスタンドアロン コンポーネントとして使用しています。バンドル/symfony-framework などはありません。
  • たとえば、さまざまな方法でハードディスクにデータを書き込むなど、すべて同様のことを担当する一連のサービスがあります(たとえば、ftp、直接ファイル操作、データベースへの保存など)。
  • これらの各サービスには、異なる構成が必要です (SQL 資格情報、FTP 資格情報など)。
  • これらのサービスの 1 つを、他のサービスが依存する「一般的な使用サービス」として定義したいと考えています。
  • 使用するサービスはパラメーターによって構成されます

例:

これらの単純化されたパラメーターとサービスの定義を考えると、次のようになります。

<parameter key="file.adapterType">direct</parameter>
<service id="file.db" />
<service id="file.ftp" />
<service id="file.direct" />

実際に利用したいサービスにエイリアスを定義したい

<service id="file.adapter" alias="file.%file.adapterType%"/>

単にこのサービスに依存している他のサービスの場合:

<service id="photos">
    <argument type="service" id="file.adapter" />
</service>

私がこれまでに試したこと:

  • エイリアス ID にパラメータを指定してエイリアスを定義します。ただし、エイリアス ID 内のパラメーターは解決されません。
  • 引数タグ内で直接 id を定義する - ここでもパラメータは解決されません:

    <service id="photo">
        <argument type="service" id="file.%file.adapterType%" />
    </service> 
    
  • 工場を作る。get メソッドは、パラメーターと di-container を受け取り、対応するサービスを返します。

    public function get(ContainerInterface $container, $parameter) 
    {
        return $container->get('file.' . $parameter);
    }
    

    ただし、コンテナーはそれ自体をサービスとして登録しません。事前に登録しても、ファイルから構成をロードするときには影響しません (その結果、「サービス 'コンテナ' が見つかりません」というエラー メッセージが表示されます)。

    $container->set("container", $container);
    $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/services'));
    $loader->load('fileadapter.xml'); // << gives error
    $container->get("container"); // << working
    

他の選択肢は?

エイリアスに依存するサービスがファイル内にあるため、構成ファイルをロードした後にエイリアスを設定できません。

これを処理する方法について他のアイデアを持っている人はいますか?

4

3 に答える 3

1

実際には、「これまでに試したこと」セクションの 3 番目の箇条書きで正しい軌道に乗っていると思いますが、サービス コンテナーはそれ自体をサービスとして登録しますが、それはservice_containerではなくと呼ばれcontainerます。

于 2012-11-10T00:35:38.687 に答える
1

私があなたの問題を正しく理解していればfile.*、サービスをファイルに移動し、使用するサービスfile.adapterを別のファイルに移動して、ファイルfile.adapterをロードする間にエイリアスを作成しながらエイリアスを作成できます。例えば

$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/services'));
$loader->load('fileadapter.xml'); 

$defaultAdapterId = "file." . $container->getParameter('file.adapterType');
if($container->hasDefinition($defaultAdapterId)) {
    $container->setAlias('file.adapter', $defaultAdapterId);
}

$loader->load('other_services.xml'); 
于 2012-11-10T09:32:14.140 に答える