web-dev-qa-db-ja.com

更新中のルールの致命的エラー:未定義のメソッドstdClass :: events()の呼び出し

私が試したこと:

  1. キャッシュの消去。
  2. モジュールを無効にして有効にしました。
  3. registry_rebuildmodule_missing_message_fixervariablecheckモジュールで試してください。

update.phpを実行しようとすると、まだ以下のエラーが発生します。

通知:unserialize():261行の\ sites\all\modules\entity\includes\entity.controller.incの1298バイトのオフセット668でのエラー

警告:57行目の\ sites\all\modules\rules\includes\rules.core.incの空の値からデフォルトオブジェクトを作成しています

致命的なエラー:767行目の\ sites\all\modules\rules\includes\rules.plugins.incの未定義のメソッドstdClass :: events()への呼び出し

2
DRUPWAY

デバッグは、問題の考えられる原因をすべて排除する技術です。以下は、問題の本当の原因を見つけるのに役立ついくつかの試みです...

1.ルールのデバッグを有効にする

あなたの質問への答えを見つけるのに役立つかもしれないものは、 Rulesdebugging...ルールsettingsRules に付属するデバッグ機能を少し試してください。少なくとも「ルール評価ログ」を確認してください(実行中のルールロジックが、実際にそのロジックの期待と一致していることを確認するため)。

Rulesdebuggingの詳細については、「 How can I display the value of条件内の変数? "。

2.すべてのアクティブなルールを無効にして、1つずつ再度有効にします

Rules モジュールを「無効にする」のではなく(再度有効にするまで問題を解決できる可能性があります)、有効のままにしてください。ただし、すべてのアクティブ(有効)ルールのdisableから始めます。

問題の原因となっているのがカスタムルールであり、アクティブなルールがない場合は、アクティブなルールをすべて無効にした後も、問題は解消されているはずです。その場合は、ルールを1つずつ再度有効にして、有効にしたルールが実行されたことを確認するためのテストを行ってください。問題が再び発生するカスタムルールに到達するまで、これを繰り返します。次に、そのルールを再度無効にし、問題が再び発生する他のルールがあるかどうかを確認します。最後に、問題が発生しないようにルールを調整して、問題が表示されないようにします。解決できない場合は、そのルールを再度有効にせず、別の方法を考えてください。

3.特別なウォッチドッグエントリ

また、予期しないウォッチドッグエントリがないか確認してください。何が起こっているのかを知る手がかりになる場合があります。

2
Pierre.Vriens

ルールモジュールを再度ダウンロードして、再試行してください。したがって、基本的にRulesフォルダーを削除し、手動で再ダウンロードするか、drushコマンドを使用します。例:

_drush -y dl rules
_

2.x-devバージョンの場合、_--dev_を追加します。

その後、キャッシュをクリアします。 MemcachedまたはRedisなどの外部キャッシュを使用している場合、それもクリアします。その後、再試行してください

ソース: 未定義のメソッドstdClass :: events()への呼び出しのインストール時のエラー


上記の方法で問題が解決しない場合、 unserialize() の通知は、構成データが破損していることを示しています。 PHP docsに従って:

渡された文字列がシリアル化できない場合、FALSEが返され、_E_NOTICE_が発行されます。

したがって、基本的にはエンティティのテーブル(_$this->entityInfo['base table']_/_$schema['fields']_)とそれが参照する行(fields column)を識別する必要があります。理想的には、unserialize()呼び出しの直後にブレークポイントまたは手動コードを設定します。

つまり、 _includes/entity.controller.inc_ ファイルを編集し、load()メソッドを見つけて、以下のように変更します。

_  $record->$field = unserialize($record->$field);
  if ($record->$field === FALSE) { // Check if field is unserializeable.
    var_dump($record->$field, $record, $field); // Or use dpm(), dd(), etc.
    // exit(); // Optional exit to improve the formatting.
  }
_

特定のパターンが見つかった場合は、次の方法で破損した行を見つけます。

_drush sql-dump --ordered-dump | grep some_unique_field_pattern
_

次に、破損したシリアル化データを修正するか、バックアップから復元するか、破損したフィールドデータを削除します。

1
kenorb