hook_post_update_NAME ()을 다시 실행하는 방법


11

드루팔 8은 도입hook_post_update_NAME() 하는 동안 몇 가지 장점이 있습니다hook_update_n 모듈을 갱신.

각각 hook_post_update_NAME()은 한 번만 실행해야하지만 개발 중에 업데이트 후크를 디버깅 할 때와 같이 때로는 다시 실행하려고합니다. 를 사용 하면 데이터베이스에서 스키마 버전을 재설정hook_update_n 할 수 있습니다 .

어떻게 다시 실행 hook_post_update_NAME()합니까?

답변:


11

실행 된 "post_update"후크는 데이터베이스, key_value테이블, post_update콜렉션에 저장되지만 데이터는 직렬화되어 직접 업데이트하기 어색합니다.

@kiamlaluno의 답변에서 일부 세부 정보를 사용하여 단일 후크를 재설정하는 데 사용할 수 있는 drush 스크립트 를 만들었습니다 . 기본 버전은 다음과 같습니다 ( 긴 버전은 여기 ).

#!/usr/bin/env drush

$key_value = \Drupal::keyValue('post_update');
$update_list = $key_value->get('existing_updates');

$choice = drush_choice($update_list, dt('Which post_update hook do you want to reset?'));

if ($choice) {
  $removed_el = $update_list[$choice];
  unset($update_list[$choice]);
  $key_value->set('existing_updates', $update_list);
  drush_print("$removed_el was reset");
} else {
  drush_print("Reset was cancelled");
}

다음은 명령 행에서 실행할 때의 모습에 대한 예입니다.

./scripts/reset_hook_post_update_NAME.drush

Which post_update hook do you want to reset?
 [0]   :  Cancel
 [1]   :  system_post_update_add_region_to_entity_displays
 [2]   :  system_post_update_hashes_clear_cache
 [3]   :  system_post_update_recalculate_configuration_entity_dependencies
 [4]   :  system_post_update_timestamp_plugins
 [5]   :  my_module_post_update_example_hook

# The script pauses for user input. 
5 

my_module_post_update_example_hook was reset

3
이것을 drush, github.com/drush-ops/drush 에 기여하는 것에 대해 생각해 보셨습니까 ?
powpow12

1
이것은 꽤 달콤한 기능이지만 핵심 Drush에는 너무 틈새입니다. 아마도 누군가가 명령 파일을 만들 것입니다.
moshe weitzman

3

다음은 drush php-eval 명령 줄에서 사용할 수있는 예입니다.

drush php-eval -e '$update_hook_name = "<my_hook_post_update_name>";
$key_value = \Drupal::keyValue('post_update');
$existing_updates = $key_value->get('existing_updates');
$index = array_search($update_hook_name,$existing_updates); 
unset($existing_updates[$index]);
$key_value->set('existing_updates', $existing_updates);'

drush updatedb를 다시 실행하면 post_update_hook이 실행 대기 중임을 알 수 있습니다.


이것은 단지 drush 9, 그것은이라고 언급, 나를 위해 잘 작동drush php:eval 'command'
powpow12

읽기 전용 환경 인 경우 매우 유용합니다. 많은 감사;)
Mirsoft

1

UpdateRegistry::getPendingUpdateFunctions()다음 코드를 포함합니다. 의견의 내용을 참조하십시오.

  // First figure out which hook_{$this->updateType}_NAME got executed
  // already.
  $existing_update_functions = $this->keyValue->get('existing_updates', []);

UpdateRegistry :: $ updateType이로 설정되었습니다 'post_update'. 의 값으로
$this->keyValue설정됩니다 .UpdateRegistryFactory::create()$this->container->get('keyvalue')->get('post_update')

해당 키 값 수집을 얻는 동등한 절차 코드는 다음과 같습니다.

$key_value = \Drupal::keyValue('post_update');

existing_updates 를 빈 배열로 설정 하면 Drupal은 사후 업데이트 콜백이 호출되지 않은 것으로 생각합니다.

$key_value = \Drupal::keyValue('post_update');
$key_value->set('existing_updates', []);

해당 키 값 의 existing_updates 키 에서 콜백 이름을 제거하면 Drupal은 업데이트 후 콜백이 아직 호출되지 않았다고 생각합니다.


0

내부에서 전화 hook_update_n()한 다음 이전에하고 있던 일을하십시오.


1
hook_post_update 메커니즘의 전체 목적은 모든 업데이트가 실행 된 모든 기능을 갖춘 Drupal을 사용할 수 있도록하는 것이므로 좋은 생각처럼 보이지 않습니다 . 업데이트 중에 Drupal 상태에 대한 보장이 없기 때문에 도입되었습니다.
Eelke Blok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.