Bagaimana cara mengubah layanan default inti

8

Ketergantungan Injeksi ditambahkan ke inti, tetapi tidak ada dokumentasi untuk memberi tahu bagaimana pengembang dapat mengubah layanan default. Sebagai contoh, saya ingin mengubah kelas cache.bootstrap ke Caching APC.

Andy Truong
sumber
1
Oh tapi ada :)
Clive
Ah, salahku. Saya menyesal.
Andy Truong
Tidak perlu meminta maaf, kecuali Anda tahu itu selesai menggunakan pass kompiler saya pikir itu akan sangat sulit ditemukan. Jika Anda mendapat kesempatan, silakan tambahkan jawaban dengan kode yang Anda gunakan, saya yakin itu akan sangat berguna bagi pengunjung masa depan. Jika tidak, saya akan mencoba mengingat untuk kembali dan menambahkan sesuatu yang generik di
Clive
Ini tidak lagi dilakukan dengan menggunakan kompiler.
Jawaban oleh @chx sempurna, tetapi perhatikan bahwa contoh Anda adalah kasus khusus. Saya sarankan Anda membuka pertanyaan terpisah tentang cara menyediakan backend cache yang berbeda dan kami dapat menjawabnya secara detail.
Berdir

Jawaban:

5

Anda bisa melihat LanguageTestServiceProvider untuk melihat bagaimana perubahan dilakukan. Atau saya dapat menawarkan kelas saya:

<?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));
    }
  }

}

Pada dasarnya, di dalam alterkamu perlu menggunakan getDefinitionmetode, lakukan sesuatu dengan definisi dan kemudian gunakan setDefinitionmetode untuk mengembalikannya.

dan kemudian inilah bagian yang relevan dari mongodb.services.yml:

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

sumber
Hanya ingin menyebutkan sepertinya Anda tidak perlu menggunakan setDefintion()jika Anda telah menggunakan getDefinition()- Anda dapat memperbarui definisi.
Andy