Điểm:0

Bộ nhớ đệm thực thể và các trường được tính toán

lá cờ ph

Tôi có một thực thể tùy chỉnh mà tôi đã thêm một số trường được tính toán vào, vì vậy các lớp liên quan là:

  • lớp MyEntity mở rộng ContentEntityBase
  • lớp ComputingFieldA mở rộng FieldItemList
  • lớp ComputingFieldB mở rộng FieldItemList

Vấn đề của tôi là tôi muốn các trường được tính toán hoàn toàn không được lưu vào bộ nhớ cache hoặc được lưu vào bộ nhớ cache nhưng với một chiến lược vô hiệu hóa khác.

Là những gì tôi muốn có thể? Hay tôi chỉ cần vô hiệu hóa bộ đệm cho toàn bộ thực thể?

Chỉnh sửa: Bản thân trường tùy chỉnh về cơ bản là số lượng hàng trong bảng cơ sở dữ liệu khác.Tôi muốn số lượng đó được lưu vào bộ đệm riêng sau đó bị vô hiệu nếu các hàng mới được chèn vào.

Đầu ra đang được sử dụng thông qua điểm cuối jsonapi mặc định cho thực thể.

Chỉnh sửa 2: Tôi đoán điều này phức tạp hơn tôi nghĩ nên tôi sẽ mô tả các thực thể chi tiết hơn:

Thực thể A:

  • Có mối quan hệ 1:1 với các nút dựa trên UUID
  • Có số lượng thực thể Thực thể B có liên quan đến nút (đã tính)
  • Có phép tính dựa trên số đếm đó (đã tính)

Thực thể B:

  • Có mối quan hệ N:1 với các nút dựa trên NID

Vì vậy, nếu một Thực thể B mới được tạo cho nút X thì tôi muốn bộ đệm bị vô hiệu hóa trên hai trường được tính toán của Thực thể A cho nút XXXX-XXXX-XXXX-XXXX để điểm cuối jsonapi hiển thị dữ liệu được tính toán cập nhật.

Nếu tôi có thể thêm thẻ bộ nhớ cache của nút:X vào từng phiên bản của trường được tính toán, tôi hy vọng điều đó sẽ đạt được những gì tôi muốn.

4uk4 avatar
lá cờ cn
Bản chỉnh sửa giống như một câu hỏi mới. Đây có phải là bảng cơ sở dữ liệu khác cũng là một bảng thực thể không? Nếu có, bạn có thể sử dụng móc CRUD của thực thể đó để vô hiệu hóa thực thể này hoặc bạn có thể thêm thẻ thực thể của thực thể khác vào trường để tự động vô hiệu hóa thực thể đó trong các thao tác CRUD. Nếu không, bạn phải tự thực hiện điều gì đó tương tự.
4uk4 avatar
lá cờ cn
Chỉnh sửa 2: Nếu đây là về các loại nội dung khác nhau, thẻ danh sách gói mới có thể hữu ích. Xem https://www.drupal.org/node/3107058
Lambic avatar
lá cờ ph
Không, đó không phải là về các loại nội dung khác nhau. Thực thể A và Thực thể B là các thực thể bảng đơn tùy chỉnh thuần túy, nhưng Thực thể A có trường uuid tham chiếu đến một nút cụ thể và Thực thể B có trường nid tham chiếu đến cùng một nút.
4uk4 avatar
lá cờ cn
OK, sau đó sử dụng thẻ `entity_b_list`.
Lambic avatar
lá cờ ph
Điều đó có thể sẽ hiệu quả, nhưng tôi không chắc mình đã thêm thẻ đó vào đâu. Trong định nghĩa thực thể? Việc triển khai FieldItemList? Một nơi khác?
4uk4 avatar
lá cờ cn
Đối với một mô-đun trường phổ quát có bộ nhớ đệm như vậy, cách đơn giản nhất có lẽ là một trình chuẩn hóa tùy chỉnh cho FieldItemList có thể trả về một đối tượng CacheableNormalization với thẻ bộ đệm. Xem bình luận của tôi dưới câu trả lời. Nếu bạn đang tìm kiếm một giải pháp dễ dàng cho trường hợp cụ thể này, bạn có thể sử dụng hook `mymodule_entity_a_load()` và thêm thẻ bộ đệm vào thực thể. Xem https://stackoverflow.com/questions/68523829/how-do-i-control-the-cacheability-of-a-node-rendered-through-jsonapi-in-drupal
Lambic avatar
lá cờ ph
Tôi sẽ bị phàn nàn về việc sử dụng triển khai hook trong đánh giá mã nhưng đó có vẻ là giải pháp đơn giản nhất, cảm ơn!
4uk4 avatar
lá cờ cn
Việc triển khai hook là những gì tôi đã tìm thấy tại SO. Nếu điều này hoạt động, bạn cũng có thể thêm thẻ danh sách vào lớp thực thể, xem câu trả lời đã chỉnh sửa.
Điểm:3
lá cờ cn

Tôi không quan trọng liệu trường có được tính toán hay không. Bộ nhớ đệm phụ thuộc vào cách trường được hiển thị trong trình định dạng trường. Siêu dữ liệu bộ nhớ cache được thêm vào mảng kết xuất nổi lên và được hợp nhất với siêu dữ liệu của các trường khác và thực thể.

Các trường theo mặc định không được lưu vào bộ nhớ cache riêng, nhưng bạn có thể thay đổi điều này. Nếu trường cần một chiến lược bộ nhớ đệm khác, hãy thêm các khóa bộ đệm và trường được kết xuất có thể được chia sẻ giữa các trường trong các phiên bản thực thể khác đang kết xuất bằng cùng một khóa bộ đệm. Nếu trường có tính năng động cao thì hãy thêm trình tạo lười biếng và đảm bảo rằng nó được giữ chỗ, tự động hoặc bằng cách đặt #create_placeholder.

Chỉnh sửa 2:

Lớp thực thể có thể thêm thẻ danh sách bộ đệm cho thực thể b:

lớp MyEntity mở rộng ContentEntityBase {

  /**
   * {@inheritdoc}
   */
  hàm công khai getCacheTags() {
    $cache_tags = cha mẹ::getCacheTags();
    $cache_tags[] = 'entity_b_list';
    trả về $cache_tags;
  }
Lambic avatar
lá cờ ph
Vì vậy, có vẻ như tôi cần xác định trình định dạng trường của riêng mình cho các trường tôi muốn sử dụng bộ nhớ đệm đặc biệt? Có vấn đề gì khi tôi sử dụng kết quả cuối cùng thông qua jsonapi không?
4uk4 avatar
lá cờ cn
Sau đó xác định một FieldNormalizer với `protected $supportedInterfaceOrClass = ComputingFieldA::class;`

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