エンティティ更新を削除する目的は何ですか?


14

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

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

Googleで少し調べた後、これに対する解決策はを実行することdrush entity-updatesです。ただし、データベースを更新した後、覚えておくか、ワークフローに組み込む必要がある別のコマンドのように見えるため、これは少し奇妙です。もちろん、元の警告に対処する方法がすぐに明らかではなかったようです。

さらに、多くの場合、開発中に[ステータス]ページに他のアクションのアラートが表示されるため、アクションを実行する必要があるかどうかがすぐにはわかりません。

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

回答:


19

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

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

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

エンティティスキーマの更新のための CR Write update関数からこの例を見つけました。自動化は削除されています(さらに例があります)。

/**
 * 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);
}

2
それを除いて、実際には悪い例です。モジュールの場合は、非常に具体的な更新を行う必要があります。新しいフィールド定義をインストールし、エンティティタイプ定義を更新します。複数のモジュールを更新する場合、またはモジュールが将来別の変更を行い、古いバージョンから更新する場合、これは非常に悪くなる可能性があります。node.installには、より良い更新例が多数あります。
ベルディール

1
最初は、これはupdb / update.phpの一部として自動的に行われました。ただし、常に機能するとは限りません。データがある場合、破壊的な更新をサポートしていないため、多くの問題が発生します。フィールドにデータがある場合、このメソッドを呼び出すことはできません。自分で更新する必要があり、非常に複雑になる可能性があります。詳細については、drupal.org / node / 2554097を参照してください
Berdir

2
Berdirのコメントに関する注意:悪い例は削除し、変更レコードの例に置き換えました。
アンディ

2
明確にするために、実稼働環境でエンティティの更新を実行するのが悪い考えである理由は、破壊的である可能性があるためです。たとえば、フィールドストレージuuidを変更し、変更されたストレージ定義をインポートし、cronを実行してから、エンティティ更新を実行すると、そのフィールドの既存のコンテンツがすべて破棄されます。
デーンパウエル

2
モジュールは、対象となる更新フックを介して独自のスキーマ更新を適用する責任があります。entity-updatesデータ破壊を気にしないカスタムモジュールを備えたサイトの開発プロセスの初期を除き、誰も定期的にコマンドを実行しないでください。
デーンパウエル

1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.