コアのデフォルトサービスを変更する方法


8

Dependency Injectionがコアに追加されていますが、開発者がデフォルトのサービスを変更する方法を説明するドキュメントはありません。たとえば、cache.bootstrapクラスをAPCキャッシングに変更したいとします。


1
ああ、でもあります :)
クライヴ

ああ、私のせい。ごめんなさい。
Andy Truong 2013

謝罪する必要はありませんが、コンパイラパスを使用して行われたことがわかっている場合を除いて、見つけるのはかなり難しいと思います。機会があれば、最終的に使用するコードを含めて回答を追加してください。将来の訪問者にとって非常に役立つと確信しています。そうでない場合は、戻って一般的なものを追加することを忘れないでください
Clive

これは、コンパイラパスを使用して行われなくなりました。

@chxの答えは完璧ですが、あなたの例は特別なケースであることに注意してください。別のキャッシュバックエンドを提供する方法について別の質問を開くことをお勧めします。詳細に回答できます。
Berdir 2013

回答:


5

LanguageTestServiceProviderを見て、変更がどのように行われるかを確認できます。または、クラスを提供することもできます。

<?php
namespace Drupal\mongodb;

use Drupal\Core\DependencyInjection\ServiceModifierInterface;
use Drupal\Core\DependencyInjection\ServiceProviderInterface;
use Drupal\Core\DependencyInjection\ContainerBuilder;

/**
 * MongoDB service provider. Registers Mongo-related services.
 */
class MongodbServiceProvider implements ServiceProviderInterface, ServiceModifierInterface {

  /**
   * {@inheritdoc}
   */
  public function register(ContainerBuilder $container) {
  }

  /**
   * {@inheritdoc}
   */
  public function alter(ContainerBuilder $container) {
    foreach ($container->findTaggedServiceIds('mongodb.override') as $id => $attribute) {
      $container->setDefinition(substr($id, 8), $container->getDefinition($id));
    }
  }

}

基本的に、メソッドalterを使用する必要がある場合はgetDefinition定義で何かを実行してsetDefinitionから、メソッドを使用して元に戻します。

そして、これがmongodb.services.ymlの関連部分です:

services:
  mongodb.flood:
    class: Drupal\mongodb\Flood\MongoDBBackend
    arguments: ['@mongo', '@request']
    tags:
      - { name: mongodb.override }

使用したことがあるsetDefintion()場合は使用する必要がないようですgetDefinition()。定義を更新するだけです。
アンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.