REST GET mà không cần lưu trữ


11

Sử dụng hướng dẫn nàydrupal gprr Lệnh của Drupal Console , tôi đã tạo tài nguyên REST tùy chỉnh trong Drupal 8. Tôi có thể sử dụng tài nguyên này để truy xuất một đối tượng JSON đơn giản nói xin chào với người dùng hiện tại bằng cách thực hiện GET trên:

http://localhost/example/hello?_format=json

JSON được trả về sau đó trông như thế này:

{ "hello": "tyler" }

Điều này được mong đợi, khi tôi đăng nhập. Nhưng khi tôi đăng xuất và thực hiện một GET khác trên tài nguyên, kết quả tương tự được trả về :

{ "hello": "tyler" }

Việc xóa bộ nhớ cache Drupal đầy đủ sẽ khắc phục sự cố này, nhưng tôi muốn vô hiệu hóa cụ thể bộ đệm ẩn trên tài nguyên này. Làm thế nào tôi có thể làm điều đó?

Như một giải pháp thay thế, tôi nghĩ rằng việc thêm dấu thời gian vào chuỗi truy vấn sẽ hoạt động:

http://localhost/example/hello?_format=json&time=123456789

Nhưng điều đó cũng trả về kết quả chính xác tương tự , bất kể giá trị tem thời gian là gì trong chuỗi truy vấn.

Để cho ngắn gọn, đây là mã bộ xương để xây dựng tài nguyên GET:

class ExampleHello extends ResourceBase {

  /**
   * {@inheritdoc}
   */
  public static function create(/* ... */) {
    return new static(/* ... */);
  }

  /**
   * Constructs a Drupal\rest\Plugin\ResourceBase object.
   */
  public function __construct(/* ... */) {
    parent::__construct(/* ... */);
    // ...
  }

  /*
   * Responds to GET requests.
   */
  public function get() {

    $account = \Drupal::currentUser()->getAccount();
    if (!$account->id()) {
      return new ResourceResponse(array(
        'welcome' => 'visitor'
      ));
    }
    return new ResourceResponse(array(
      'hello' => $account->getAccountName()
    ));
  }

}

Có cấu hình / cài đặt nào tôi cần đặt trên plugin này để tắt bộ đệm ẩn trên các yêu cầu GET không?

Câu trả lời:


16

Bạn muốn đọc các tài liệu về bộ nhớ đệm . nó nói kết xuất mảng, nhưng nó cũng áp dụng cho các đối tượng phản hồi.

ResourceResponse triển khai bộ đệm CachizableResponseInterface, có phương thức addCachitableDependency.

Nếu bằng mọi cách có thể, bạn muốn tránh vô hiệu hóa bộ đệm (điều bạn sẽ làm bằng cách đặt độ tuổi tối đa của bộ đệm thành 0), nhưng thêm bối cảnh bộ đệm cần thiết và thẻ bộ đệm.

Trong bộ đệm của bạn, điều đó có nghĩa là tất cả những gì bạn cần làm là $ reply-> addCachitableDependency (tài khoản $).

Bạn cũng không cần getAccount (), chỉ cần sử dụng trực tiếp currentUser (), đó là proxy.


3
Bạn cũng nên tránh sử dụng \Drupalở những nơi bạn có thể tiêm dịch vụ, dựa trên mã nhận xét của bạn, có vẻ như bạn có thể làm ở đây.
mpdon Arena

11

Tôi gặp vấn đề tương tự.

Sau khi đọc qua tài liệu và xem qua trang này, tôi đã có thể tắt bộ đệm cho điểm cuối tùy chỉnh của mình. Đây là một ví dụ về mã làm việc của tôi bên trong hàm get () cho điểm cuối của tôi:

$build = array(
  '#cache' => array(
    'max-age' => 0,
  ),
);

return (new ResourceResponse($myResponse))->addCacheableDependency($build);

Thêm điều này để tham khảo trong tương lai, hy vọng điều này sẽ giúp bất cứ ai cần nó.

Trang tài liệu về bộ nhớ cache


Không hoạt động !!!!
podarok

@podarok - điều này ban đầu cũng không hiệu quả với tôi, sau đó sau khi phát hành thêm một lần nữa, drush crnó hoạt động mỗi lần sau đó.
tyler.frankenstein

1
làm việc như người ở.
Mohamed Osama Gbril

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.