캐싱없이 REST GET


11

이 튜토리얼 Drupal Console의 drupal gprr명령을 사용하여 Drupal 8에서 사용자 정의 REST 자원을 작성했습니다.이 자원을 사용하여 GET을 수행하여 현재 사용자에게 인사하는 간단한 JSON 오브젝트를 검색 할 수 있습니다.

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

캐시 가능성 문서 를 읽으려고합니다 . 렌더 배열이라고하지만 응답 객체에도 적용됩니다.

ResourceResponse는 addCacheableDependency 메소드가있는 CacheableResponseInterface를 구현합니다.

가능한 경우 캐시를 비활성화하지 말고 (캐시 최대 수명을 0으로 설정하여 수행함) 필요한 캐시 컨텍스트 및 캐시 태그를 추가하십시오.

캐시에서는 $ response-> addCacheableDependency ($ account) 만 있으면됩니다.

또한 getAccount ()가 필요 없으며 currentUser ()를 직접 사용하면 프록시입니다.


3
또한 \Drupal주석 처리 된 코드를 기반으로 서비스를 주입 할 수있는 장소에서 사용 하지 않는 것이 좋습니다.
mpdonadio

11

나는 같은 문제가 있었다.

설명서를 읽고이 페이지를 살펴본 후 사용자 지정 엔드 포인트에 대한 캐시를 종료 할 수있었습니다. 다음은 엔드 포인트의 get () 함수 내에서 작동하는 코드의 예입니다.

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

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

나중에 참조 할 수 있도록 추가하면 도움이되기를 바랍니다.

CacheableResponseTrait 설명서 페이지


작동하지 않습니다 !!!!
podarok 2019

@ podarok-이것은 처음에는 나에게도 효과가 없었으며, 하나 더 발행 한 후에 drush cr는 매번 작동했습니다.
tyler.frankenstein

1
매력처럼 일했다.
Mohamed Osama Gbril

5

나는 또한 같은 문제가 있었고 그 해결책은 다음과 같습니다.

$response->getCacheableMetadata()->addCacheContexts(['url.query_args', 'url.path']);

CacheableMetadata캐시 컨텍스트 문서 도 볼 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.