Junkinsのブログスマートフォン用の表示で見るJunkinsのブログこの広告は、90日以上更新していないブログに表示しています。2016どうもこんばんははじまりました。2016生意気にも毎週水曜日を私、Junkinsの日として3本記事を書かせていただきたいと思います。読んでいただけると幸いです。これを機にブログも始めました。Junkinsのブログです。Entity編」です。配列をEntityに変換する処理についてまとめたいと思います。このテーマを選んだ理由は、CakePHP2経験者が最も戸惑う部分がEntityの扱いだと思うからです。配列からEntityの第一歩リクエストデータをEntityに変換する処理はEntityを生成する処理の中でもよく見る処理です。実際にEntityを生成する処理はどこに記述されているか?newEntity()とpatchEntity()はCake\ORM\Tableの関数です。実際に配列からEntityの生成を行っているクラスはCake\ORM\Marshallerになります。Marshallerの流れを見てみようMarshaller::one()、Marshaller::merge()の処理の流れこの流れを掴んでデバックがやりやすくなったなと感じます。Marshallerを通すとaliasが自動で付与されます。それぞれの処理を詳しく見てみよう。事前のコールバック処理(beforeMarshal)このコールバックはCakePHP2でいう、beforeValidate()になります。バリデーションの前に対象データを触ることができます。使いかたはこのリンクを参照してください。CakePHP2にはafterValidate()がありましたが、afterMarshal()はありません。EntityClassの生成newEntity()の場合のみEntityのインスタンス化をおこないます。引数を特に指定しない場合はTableクラス内で処理が完結します。アソシエーション先のModelのEntity生成と結合アソシエーション先のModelのEntityの生成はMarshallerで行なわれます。Entityクラスをインスタンス化する場合ではアソシエーション先のModelのEntityは結合されません。アソシエーションの設定を行うのはTableクラスなので、考えれば当然ですね。バリデーションの実行バリデーションの実行場所はMarshaller::_validate()です。下記にソースコードを書きます。バリデーションの実行場所はTableクラスとばかり思ってましたが、Marshaller::_validate()を経由して実行されます。Table->Marshaller->Tableと処理が移動するので、ちょっと複雑で読みにくい部分ですね。カラムの型に合わせたデータの変換CakePHP3では配列からEntityを生成する際に、そのカラムのデータ型に合わせた値の変換をかけます。定義されていますが、独自のカラムタイプを定義することも可能です。http://book.cakephp.org/3.0/en/orm/database-basics.html#adding-custom-typesバリデーションを無事通過したデータはこのTypeクラスを経由して変換がかけられます。Cake\I18n\FrozenTimeオブジェクトにいきなり変わってびっくりしました。)そして、最終的に既存Entityとのマージを行います。既存のEntityデータはoriginalに、変更があったデータはdirtyに格納されます。Marshallerを通してインスタンス化する場合はオプションの指定ができません。];現状は、設定を書いたEntityクラスをTableに設定してインスタンス化を行っていますが。