Cakephp4 にて、newEntity()
メソッドを呼び出す際のライフサイクルにて、beforeMarshal()
を実行しないようにするには、以下のようにコードを書くことができます。
beforeMarshal() を一時的に無効化
$table = TableRegistry::getTableLocator()->get('YourTableName'); $originalBeforeMarshal = $table->getEventManager()->off('Model.beforeMarshal'); // エンティティを作成 ※beforeMarshalは実行されない $entity = $table->newEntity($data); // beforeMarshalを元に戻す $table->getEventManager()->on('Model.beforeMarshal', $originalBeforeMarshal);
このコードでは、TableRegistry
を使用してテーブルを取得し、getEventManager()->off('Model.beforeMarshal')
を呼び出して beforeMarshal
フックを無効にし、新しいエンティティを作成します。その後、on
メソッドを使用して beforeMarshal
フックを元に戻します。
この方法を使用すると、newEntity()
を呼び出す際に beforeMarshal
が無効化できるので、特定のケースで実行したくない場合などに活用できます。
■ Cakephp4: コールバック及びリスナーの削除
https://book.cakephp.org/4/ja/core-libraries/events.html#id15
■ Cakephp4: getEventManager()
https://api.cakephp.org/4.4/trait-Cake.Event.EventDispatcherTrait.html#getEventManager()