Cakephp PHP WEB開発

【Cakephp2→4】beforeValidateはbeforeMarshalとして代替

※本サイトはPR表記を含みます。

Cake4 では Cake2 時代では存在していた beforeValidate() が存在していません。
なので、Cake4 では beforeMarshal() の利用を検討します。

Cake2: beforeValidate の例

public function beforeValidate($options = []) {
    // バリデート検証処理サイクルへ進む前にデータを整えておきたい処理など
}

beforValidate() の役目は、検証処理へ進む前に予めユーザ入力からのデータ構造を整えたりする、といったことが考えられると思います。
それらの処理は、Cake4 では beforeMarshal() で補うことが可能です。

Cake4: beforeMarshal の例

use ArrayObject;
use Cake\Event\EventInterface;

/**
* Cake2時代のbeforValidateの代替として、beforeMarshalを利用
*
* @param \Cake\Event\EventInterface $event イベントオブジェクト
* @param \ArrayObject $data リクエストデータ群
* @param \ArrayObject $options オプション
* @return void|null
*/
public function beforeMarshal(EventInterface $event, ArrayObject $data, ArrayObject $options)
{
    // beforeValidateで処理していた内容を移行できる
    // $data['name'] などでリクエストデータにアクセス可能
}

注意したいことは、処理のライフサイクルの各役目だと思います。厳密には newEntity() でエンティティ生成のバリデート前に beforeMarshal() が発火するので、例えば、それが保存手前で処理を入れたい場合は beforeSave() になるでしょう。

本バリデートはバリデート自体に任せればよいと思います。

■ Cakephp4: beforeMarshal
https://book.cakephp.org/4/ja/orm/table-objects.html#beforemarshal

■ Cakephp4: エンティティー構築前のリクエストデータ変更
https://book.cakephp.org/4/ja/orm/saving-data.html#before-marshal

-Cakephp, PHP, WEB開発
-