Điểm:1

Đưa một thể hiện MỚI của một dịch vụ vào một lớp dịch vụ khác

lá cờ de

Tôi có một dịch vụ (để gửi thông báo lỗi) được nhiều dịch vụ khác sử dụng.

Dịch vụ cảnh báo được đưa vào các lớp đó thông qua các tệp services.yml có liên quan và thông qua các hàm tạo của chúng.

Tuy nhiên, cả hai lớp đều chia sẻ cùng một thể hiện của dịch vụ (điều mà tôi thực sự không nhận ra cho đến bây giờ). Nếu tôi đặt một thuộc tính từ một lớp, lớp kia sẽ sử dụng thuộc tính đó sau này.

Trong một số trường hợp, điều này sẽ rất tuyệt, nhưng trong trường hợp sử dụng của tôi, tôi muốn mỗi lớp bắt đầu bằng một phiên bản mới của lớp dịch vụ cảnh báo.

Có cách nào, thông qua services.yml, hàm tạo hoặc bất kỳ phương tiện nào khác để đạt được điều này không?

Jaypan avatar
lá cờ de
Các dịch vụ được thiết kế riêng lẻ - chúng chỉ được tạo ra một lần duy nhất. Các dịch vụ cung cấp chức năng, chúng không nhất thiết dành cho lưu trữ dữ liệu, vì vậy có thể bạn cần suy nghĩ lại về kiến ​​trúc đằng sau cách bạn lưu trữ dữ liệu và lưu trữ dữ liệu tương ứng với một đối tượng hoặc trong lớp gọi dịch vụ.
Geat avatar
lá cờ de
Điều đó có ý nghĩa. Có một dịch vụ không tương đương với một dịch vụ có thể được đưa vào một lớp không?
Jaypan avatar
lá cờ de
Không, nhưng nếu nó không phải là một singleton, nó sẽ không cần phải được đưa vào, bạn chỉ có thể khởi tạo một phiên bản mới của lớp nếu cần.
Geat avatar
lá cờ de
Tôi thích ý tưởng sử dụng dịch vụ của nhà máy hơn, đặc biệt đối với các lớp có nhiều đối số hàm tạo.
4uk4 avatar
lá cờ cn
Trong các dịch vụ Drupal theo mặc định là các đơn lẻ (được chia sẻ). Nhưng bạn có thể xác định một dịch vụ không chia sẻ. Xem https://symfony.com/doc/current/service_container/shared.html
Geat avatar
lá cờ de
@ 4k4 Tôi có ấn tượng rằng đây không phải là cách Drupal dự định sử dụng các dịch vụ, nhưng nó chính xác là thứ tôi đang tìm kiếm.
Điểm:3
lá cờ cn

Câu trả lời trực tiếp là trích dẫn tài liệu Symfony:

Trong vùng chứa dịch vụ, tất cả các dịch vụ được chia sẻ theo mặc định. Cái này có nghĩa là mỗi lần truy xuất dịch vụ, bạn sẽ nhận được cùng một ví dụ. Đây thường là hành vi bạn muốn, nhưng trong một số trường hợp, bạn có thể muốn luôn có một phiên bản mới.

Để luôn nhận phiên bản mới, hãy đặt cài đặt chia sẻ thành false trong định nghĩa dịch vụ của bạn:

# config/services.yaml
dịch vụ:
    Ứng dụng\SomeNonSharedService:
        chia sẻ: sai
        #...

https://symfony.com/doc/current/service_container/shared.html

Thảo luận về ý định Drupal khó vì không có nhiều tài liệu tham khảo. Khi Drupal 8 được thiết kế, cài đặt dịch vụ này không tồn tại và phiên bản trước đó đã bị tranh chấp do phạm vi yêu cầu hiện đã bị xóa. Tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào cho thấy Drupal có xu hướng chống lại việc sử dụng các dịch vụ không chia sẻ. Ngược lại, đây là một cuộc thảo luận trong đó cốt lõi cuối cùng đã chuyển từ nhà máy sang dịch vụ không chia sẻ, trên thực tế cũng là một giải pháp dựa trên nhà máy, chỉ có điều đây là nhà máy đã được triển khai trong Symfony:

https://www.drupal.org/project/drupal/issues/2660124#comment-12318542

Điểm:2
lá cờ ph

Có một vài lựa chọn xuất hiện trong tâm trí:

  1. Tạo một dịch vụ gốc cung cấp các phiên bản của lớp cảnh báo phi dịch vụ của bạn
  2. Triển khai lớp cảnh báo của bạn dưới dạng plugin

Cái nào bạn chọn thực sự phụ thuộc vào kiến ​​trúc của bạn.

Geat avatar
lá cờ de
Tôi đã cấu trúc lại mã và dịch vụ của nhà máy hoạt động rất tốt.

Đă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.