페이지 당 고유해야하는 블록이 로그 아웃 한 사용자에게 적합하지 않은 문제가 발생했습니다. 문제는 사용자 정의 필터를 포함하는 뷰 검색 페이지에있는 사용자 정의 블록 플러그인입니다 (노출 된 필터의 사용자 정의 대체물과 같습니다.
Drupal 8에 대해 배운 내용을 바탕으로 캐시 컨텍스트를 빌드 배열에 추가했습니다.
public function build() {
$search_form = \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\SearchForm');
return [
'search_form' => $search_form,
'#cache' => ['contexts' => ['url.path', 'url.query_args']]
];
}
그러나 로그 아웃 할 때 블록이 첫 번째보기에서 캐시되고 URL이 변경되면 새로운 버전의 블록을 표시하지 않았기 때문에 이것은 잘못된 것 같습니다.
문제의 원인이되는보기 페이지라고 생각했지만보기 페이지에서 캐싱을 끄더라도 문제가 남아 있습니다.
예를 들어 preprocess_block 후크를 사용하여 여러 가지 방법으로 문제를 해결할 수있었습니다.
function mymodule_preprocess_block__mycustomsearchblock(&$variables) {
$variables['#cache']['contexts'][] = 'url.path';
$variables['#cache']['contexts'][] = 'url.query_args';
}
그러나 캐시 컨텍스트를 내 블록의 빌드 배열에 넣을 수 없었습니다.
내 블록이 BlockBase를 확장하므로 getCacheContexts () 메서드를 사용해보기로 결정했습니다. 특히 코어 내의 일부 모듈이 이런 식으로 작동하는 것을 보았 기 때문에 특히 그렇습니다.
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), ['url.path', 'url.query_args']);
}
이것은 또한 문제를 해결했지만 흥미롭게도 전처리 블록 함수에서 변수를 출력하면 $ variables [ '# cache'] [ 'contexts']에 표시되지 않지만 $ variables [ 'elements에 표시됩니다 '] ['# cache '] ['컨텍스트 ']
array:5 [▼
0 => "languages:language_interface"
1 => "theme"
2 => "url.path"
3 => "url.query_args"
4 => "user.permissions"
]
이것이 어떻게 작동하는지, 왜 빌드 기능에서 작동하지 않는지 알아 내려고 노력 중입니다.
viewMultiple () 함수에서 /core/modules/block/src/BlockViewBuilder.php를 보면 엔티티와 플러그인에서 캐시 태그를 가져 오는 것처럼 보입니다.
'contexts' => Cache::mergeContexts(
$entity->getCacheContexts(),
$plugin->getCacheContexts()
),
그래서 getCacheContexts () 메소드를 블록 플러그인에 추가하면 컨텍스트가 블록에 추가되는 이유를 설명합니다. 또한 같은 클래스에서 preRender 메소드를 살펴보면 블록 빌드 함수에서 캐시 배열을 사용하지 않는 것처럼 보입니다. Drupal 8에서 캐싱을 추가하는 방법은 #cache를 추가하는 것 같습니다. 요소를 렌더링하는 요소입니다.
제 질문은
1) 블록 플러그인에서 어레이에 직접 추가 된 캐시 컨텍스트가 무시됩니까?
2) 그렇다면 그 주위에 방법이 있습니까? 빌드 배열의 자식 요소에 추가해야합니까?
3) 직접 추가 된 컨텍스트가 무시되면 getCacheContexts ()를 추가하여 사용자 정의 모듈에서 블록 플러그인으로 이동합니까?