web-dev-qa-db-ja.com

Drushエンティティ更新の目的は何ですか?

Drupal 8モジュールを更新した後、Drupal 8ステータスページで次のことを警告されます。

エンティティ/フィールド定義:エンティティタイプとフィールド定義で次の変更が検出されました。

少しグーグルを駆使した後、これの解決策はdrush entity-updates。ただし、データベースを更新した後に覚えたり、ワークフローに組み込んだりする必要がある別のコマンドのようであり、元の警告への対処方法がすぐに明らかではないことは言うまでもありません。

さらに、開発中はステ​​ータスページに他のアクションのアラートが表示されることがよくあります。これは、これを実行する必要があるかどうかすぐにはわからないことを意味します。

この警告の目的を誰かが説明できますか?または、なぜこの機能がD8に導入されたのですか?なぜデータベース更新操作に組み込まれていないのに、個別に実行する必要があるのですか?

14
njp

drush entity-updatesは開発者ツールです。カスタムモジュールでエンティティ/フィールドの定義を変更すると、これをすばやく適用できます。

本番環境では、これは起こらないはずです。公式リリース間でモジュールを更新する場合、モジュールの更新コードでこれを処理する必要があります。

しかし、あなたの場合、あなたはあなたのサイトが開発中であることを言及しています。そのため、これを引き起こした可能性のあることがたくさんあります。独自のコード、またはcontribモジュールの開発版またはアルファ版のいずれか。

私はCRからこの例を見つけましたエンティティスキーマの更新用の更新関数の書き込み、自動化は削除されました(他の例があります):

/**
 * Add 'revision_translation_affected' field to 'node' entities.
 */
function node_update_8001() {
  // Install the definition that this field had in
  // \Drupal\node\Entity\Node::baseFieldDefinitions()
  // at the time that this update function was written. If/when code is
  // deployed that changes that definition, the corresponding module must
  // implement an update function that invokes
  // \Drupal::entityDefinitionUpdateManager()->updateFieldStorageDefinition()
  // with the new definition.
  $storage_definition = BaseFieldDefinition::create('boolean')
      ->setLabel(t('Revision translation affected'))
      ->setDescription(t('Indicates if the last edit of a translation belongs to current revision.'))
      ->setReadOnly(TRUE)
      ->setRevisionable(TRUE)
      ->setTranslatable(TRUE);

  \Drupal::entityDefinitionUpdateManager()
    ->installFieldStorageDefinition('revision_translation_affected', 'node', 'node', $storage_definition);
}
19
4k4

コマンド「drush entity-updates」はv 8.7.0から削除されました

https://www.drupal.org/node/3034742 を参照してください

8.7.0以降、Drupalコアはエンティティの自動更新をサポートしなくなりました。エンティティタイプまたはフィールドストレージ定義を作成、変更、または削除する必要がある場合は常に、更新APIによって提供される明示的な更新関数、およびエンティティー定義更新マネージャーによって提供されるAPIの使用。

1
Andriyun