
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()