Điểm:5

Mở rộng lớp dịch vụ filelog mô-đun contrib hiển thị lỗi triển khai PSR

lá cờ nl

Tôi muốn ghi đè dịch vụ logger.filelog từ hồ sơ module để sử dụng trình phân tích cú pháp của riêng tôi.

Một lỗi xảy ra thông qua drush cimdrush cr khi mô-đun tùy chỉnh mới ghi đè dịch vụ được bật.

Trang web này gặp phải một lỗi không mong muốn. Vui lòng thử lại sau.
Symfony\Component\DependencyInjection\Exception\LogicException: Dịch vụ 'logger.filelog' cho người tiêu dùng 'logger.factory' không triển khai Psr\Log\LoggerInterface. trong Drupal\Core\DependencyInjection\Compiler\TaggedHandlersPass-> processServiceCollectorPass() (dòng 182 của /app/docroot/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php).

Cấu trúc mô-đun tùy chỉnh của tôi trông như thế này

custom_module
  - src
    - Tiều phu
      - TestFilelog.php
    CustomModuleServiceProvider.php
  custom_module.info.yml
  custom_module.module

Hiện tại lớp nhà cung cấp dịch vụ đã triển khai ServiceModifierGiao diện và thay đổi dịch vụ logger.filelog ban đầu bằng cách đặt lớp của nó thành Drupal\custom_module\Logger\TestFilelog.

/**
 * Lớp ghi đè mô-đun đóng góp dịch vụ logger.filelog.
 */
lớp CustomModuleServiceProvider triển khai ServiceModifierInterface {

  /**
   * {@inheritdoc}
   */
  chức năng công cộng thay đổi (ContainerBuilder $container) {
    if ($container->has('logger.filelog')) {
      $definition = $container->getDefinition('logger.filelog');
      $definition->setClass('Drupal\custom_module\Logger\TestFilelog');
    }
  }

}

TestFilelog.php

không gian tên Drupal\custom_module\Logger;

sử dụng Drupal\filelog\Logger\FileLog;

/**
 * Trình ghi nhật ký dựa trên tệp.
 */
lớp TestFileLog mở rộng FileLog {

  /**
   * Kết xuất một tin nhắn thành một chuỗi.
   *
   * @param mức $ hỗn hợp
   * Mức độ nghiêm trọng của thông điệp tường trình.
   * @param chuỗi $message
   * Nội dung thông điệp tường trình.
   * Mảng @param $context
   * Bối cảnh của thông điệp tường trình.
   *
   * chuỗi @return
   * Tin nhắn được định dạng.
   */
  hàm được bảo vệ kết xuất($level, $message, array $context = []): string {

    $plainString = parent::render($level, $message, $context);

    $custom_channel = [
      'filter_custom_channel'
    ];

    if (in_array($context['channel'], $custom_channel)) {
      $plainString = $this->parseStrMasking($plainString);
    }
    trả về $plainString;
  }

  /**
   * Mặt nạ chi tiết cá nhân từ chuỗi để bản ghi.
   *
   * @param chuỗi $pureString
   * Chuỗi được phân tích cú pháp.
   *
   * chuỗi @return
   * Chuỗi đã được che dấu.
   */
  hàm được bảo vệ parseStrMasking(string $pureString) {
    // Mặc định trả về finalString.
    $ finalString = $pureString;
    
    // Phân tích cú pháp tùy chỉnh ở đây.
    
    trả lại $ finalString;
  }

}

tôi thấy rằng Drupal\filelog\Logger\FileLog;sử dụng RfcLoggerTrait; cái nào thực hiện Psr\Log\LoggerGiao diện, tôi đang thiếu gì ở đây ??

lá cờ cn
Mã của bạn hoạt động tốt với tôi - bạn đã thử khởi động lại Apache/PHP-FPM chưa?
lá cờ cn
Tuy nhiên, bạn có một sự khác biệt nhỏ - bạn đang trộn lẫn cách viết hoa của `TestFileLog` (đó là `Testfilelog` trong tên tệp và thay đổi dịch vụ). Có thể tạo sự khác biệt nếu bạn đang sử dụng hệ thống tệp phân biệt chữ hoa chữ thường
Michael Chen avatar
lá cờ nl
OMG @Clive bạn hoàn toàn đúng! Kudos cho bạn người bạn đời!
Michael Chen avatar
lá cờ nl
Xin cho biết, trong khi vật lộn đêm qua, tôi đã phát hiện ra một cách khác để ghi đè dịch vụ của mô-đun đóng góp thông qua custom_module.services.yml. Nó hoạt động, vì vậy tôi đã sử dụng nó để thay thế. Cảm ơn bạn đã nỗ lực thử nghiệm và đọc qua, cảm ơn!
Điểm:2
lá cờ nl

Như @Clive đã chỉ ra trong nhận xét ở trên, tôi đã có sự khác biệt trong cách viết hoa của TestFilelogTestFileLog. Cảm ơn một lần nữa!

Điều này sẽ tạo ra sự khác biệt về lý do tại sao việc triển khai giao diện không được Drupal đọc khi xử lý dịch vụ.

Mặt khác, tôi phát hiện ra một cách tiếp cận khác để ghi đè hồ sơ dịch vụ của mô-đun mà tôi đã sử dụng để thay thế.

  1. tôi đã xóa CustomModuleServiceProvider.php tập tin
  2. Tạo custom_module.services.yml
  3. tên máy dịch vụ phải giống với dịch vụ bị ghi đè. (ví dụ: logger.filelog)
    Kiểm tra docroot/modules/contrib/filelog/filelog.services.yml

Nội dung của custom_module.services.yml

dịch vụ:
  logger.filelog:
    lớp: Drupal\custom_module\Logger\TestFileLog
    tranh luận:
      - '@config.factory'
      - '@tiểu bang'
      - '@mã thông báo'
      - '@datetime.time'
      - '@logger.log_message_parser'
      - '@filelog.file_manager'
    thẻ:
      - { tên: người khai thác gỗ }

Tham khảo:

  1. Cách trang trí Dịch vụ - Symfony
  2. Thay đổi các dịch vụ hiện có - Drupal
  3. Các dịch vụ ghi đè trong Drupal - PreviousNext
lá cờ fr
Xác định lại dịch vụ như thế sẽ là lựa chọn cuối cùng của tôi. Các lựa chọn tốt hơn là cách bạn đã làm trong câu hỏi ban đầu hoặc bằng cách trang trí. Lý do là việc xác định logger.filelog của riêng bạn trong tệp services.yml không có tác dụng gì để chỉ ra rằng đây là một dịch vụ bị ghi đè - ý định của lập trình viên bị che khuất (có phải chỉ là do nhầm lẫn khi một dịch vụ có tên trước đó đã được sử dụng?) . Ngoài ra, điều gì sẽ xảy ra nếu mô-đun Filelog được tải *sau* mô-đun của bạn - dịch vụ nào thực sự được xác định, của bạn hay dịch vụ Filelog? Và điều gì sẽ xảy ra nếu một mô-đun khác ghi đè lên logger.filelog?
Michael Chen avatar
lá cờ nl
Ôi chao! Mối quan tâm của bạn có lý, có lẽ tôi nên tinh chỉnh nó trở lại định dạng ban đầu và kiểm tra xem nó có hoạt động không.Mặt khác, có nguồn nào khác mà tôi có thể tham khảo để trang trí dịch vụ không? Tôi chỉ đọc rằng trang trí mở rộng dịch vụ ban đầu, nhưng trong khi triển khai nó, tôi thực sự không biết mình nên ghi đè dịch vụ ban đầu bằng dịch vụ trang trí như thế nào. Chúc mừng!
lá cờ fr
Đây là một bài viết khá hay sẽ giúp: https://www.phase2t Technology.com/blog/using-symfony-service-decorators-drupal-8
Michael Chen avatar
lá cờ nl
Cảm ơn thông tin, bài viết này thực sự hữu ích vì nó viết mọi chi tiết về quá trình cân nhắc và suy nghĩ của họ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.