Cách thay đổi dịch vụ mặc định của lõi


8

Dependency Injection được thêm vào lõi, nhưng không có tài liệu nào cho biết nhà phát triển có thể thay đổi các dịch vụ mặc định như thế nào. Ví dụ, tôi muốn thay đổi lớp cache.bootstrap thành APC Cache.


1
Ồ nhưng :)
Clive

Aw, lỗi của tôi. Tôi xin lỗi.
Andy Trương

Không cần phải xin lỗi, trừ khi bạn biết nó đã được thực hiện bằng cách sử dụng trình biên dịch, tôi nghĩ rằng nó sẽ khá khó tìm. Nếu bạn có cơ hội, vui lòng thêm câu trả lời với mã bạn kết thúc sử dụng, tôi chắc chắn rằng nó sẽ rất hữu ích cho khách truy cập trong tương lai. Nếu không tôi sẽ cố nhớ quay lại và thêm một cái gì đó chung chung vào
Clive

Nó không còn được thực hiện bằng cách sử dụng trình biên dịch.

Câu trả lời của @chx là hoàn hảo, nhưng lưu ý rằng ví dụ của bạn là trường hợp đặc biệt. Tôi đề nghị bạn mở một câu hỏi riêng về cách cung cấp một phụ trợ bộ đệm khác và chúng tôi có thể trả lời chi tiết.
Berdir

Câu trả lời:


5

Bạn có thể xem LanguageTestServiceProvider để xem các thay đổi được thực hiện như thế nào. Hoặc tôi có thể cung cấp lớp học của tôi:

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

}

Về cơ bản, trong alterbạn cần sử dụng getDefinitionphương thức, làm một cái gì đó với định nghĩa và sau đó sử dụng setDefinitionphương thức để đặt lại.

và sau đây là các phần có liên quan của mongodb.service.yml:

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

Chỉ muốn đề cập đến có vẻ như bạn không cần sử dụng setDefintion()nếu bạn đã sử dụng getDefinition()- bạn chỉ có thể cập nhật định nghĩa.
Andy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.