REST GET โดยไม่มีการแคช


11

การใช้คำสั่งของ Drupal Console บทช่วยสอนนี้drupal gprrฉันได้สร้างทรัพยากร REST แบบกำหนดเองใน Drupal 8 ฉันสามารถใช้ทรัพยากรนี้เพื่อดึงข้อมูลวัตถุ JSON แบบง่ายที่กล่าวสวัสดีกับผู้ใช้ปัจจุบันโดยทำ GET บน:

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

JSON กลับมาแล้วมีลักษณะเช่นนี้:

{ "hello": "tyler" }

สิ่งนี้เป็นสิ่งที่คาดหวังเมื่อฉันเข้าสู่ระบบ แต่เมื่อฉันออกจากระบบและทำ GET อื่นบนทรัพยากรผลลัพธ์ที่เหมือนกันจะถูกส่งคืน :

{ "hello": "tyler" }

การล้างแคชแบบเต็ม Drupal ช่วยแก้ไขปัญหานี้ได้ แต่ฉันต้องการปิดใช้งานการแคชกับทรัพยากรนี้เป็นพิเศษ ฉันจะทำสิ่งนั้นได้อย่างไร

ฉันคิดว่าการเพิ่มการประทับเวลาลงในสตริงการสืบค้นจะได้ผล:

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

แต่นั่นก็ส่งกลับผลลัพธ์เดียวกันแน่นอนไม่ว่าค่าการประทับเวลาใดในสตริงการสืบค้น

สำหรับความกะทัดรัดนี่เป็นรหัสโครงกระดูกสำหรับการสร้างทรัพยากร 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()
    ));
  }

}

มีการกำหนดค่า / การตั้งค่าที่ฉันต้องตั้งค่าบนปลั๊กอินนี้เพื่อปิดใช้งานการแคชกับคำขอ GET หรือไม่

คำตอบ:


16

คุณต้องการที่จะอ่านเอกสาร cacheability มันบอกว่าเรนเดอร์เรย์ แต่มันก็ใช้กับวัตถุตอบสนอง

ResourceResponse ใช้ CacheableResponseInterface ซึ่งมีเมธอด addCacheableDependency

หากเป็นไปได้คุณต้องการหลีกเลี่ยงการปิดการใช้งานแคช (ซึ่งคุณต้องทำโดยการตั้งค่าอายุสูงสุดของแคชเป็น 0) แต่เพิ่มบริบทแคชที่จำเป็นและแท็กแคช

ในแคชของคุณนั่นหมายถึงสิ่งที่คุณต้องทำคือ $ response-> addCacheableDependency (บัญชี $)

คุณไม่จำเป็นต้องใช้ getAccount () เพียงแค่ใช้ currentUser () โดยตรงมันเป็นพรอกซี


3
คุณควรหลีกเลี่ยงการใช้\Drupalในสถานที่ที่คุณสามารถฉีดบริการซึ่งขึ้นอยู่กับรหัสความคิดเห็นของคุณดูเหมือนว่าคุณสามารถทำได้ที่นี่
mpdonadio

11

ฉันมีปัญหาเดียวกัน

หลังจากอ่านเอกสารและดูหน้านี้ฉันสามารถปิดแคชสำหรับจุดปลายทางที่กำหนดเองได้ นี่คือตัวอย่างของรหัสการทำงานของฉันในฟังก์ชัน get () สำหรับจุดปลายของฉัน:

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

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

การเพิ่มสิ่งนี้สำหรับการอ้างอิงในอนาคตหวังว่าสิ่งนี้จะช่วยให้ทุกคนที่ต้องการมัน

หน้าเอกสารCacheableResponseTrait


ใช้งานไม่ได้ !!!!
podarok

@podarok - นี่ไม่ได้ผลในตอนแรกสำหรับฉันเช่นกันหลังจากออกอีกหนึ่งครั้งdrush crมันก็ใช้งานได้ทุกครั้งหลังจากนั้น
tyler.frankenstein

1
ทำงานเหมือนจับใจ
Mohamed Osama Gbril

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.