Junkinsのブログスマートフォン用の表示で見るJunkinsのブログこの広告は、90日以上更新していないブログに表示しています。ComponentとHelperにもControllerと同様のPrefix機能を作成するPluginを作成したのでメモCakePHP3ではPrefixをつけると、Controllerをディレクトリごとに分けて設置することができます。Prefixで分けて作成します。Model、Component、Helperも同様に分けたい思いPluginを作成しました。}}便利なところPrefixのディレクトリに該当のクラスが存在しなければ、通常のディレクトリ配下のクラスを探しに行きます。認証機能拡張Pluginを作成したのでメモよく要件に出る認証関係の機能をPluginにまとめました。パスワードリマインダパスワードを忘れてしまった場合に、該当のメールアドレスを入力し、リセットされたランダムパスワードを送信する機能Setup事前の準備はStandardAuthComponentと、StandardAuthBehaviorを対象のコントローラーとTableにセットするだけ。21日目として投稿したものです。毎週水曜日Junkinsの日3日目でございます。私がCakePHP3を触って1年半になります。今年はCakePHPに慣れてきたのでいくつかPluginを作成しました。この記事ではPluginの紹介となぜ作った理由について書きたいと思います。紹介するPluginは2つです。未完成なところもありますが、今年のまとめとして書きたいと思います。Junkins/MultiStepForm1つ目はMultiStepFormです。用途は「複数ページの入力画面」です。複数のタブで入力画面を開いた場合でも、タブを超えてデータが共有されないように作成しています。作ったキッカケシステム管理者を登録する複数ページの入力画面を作る際にこんな問題が発生しました。戻るボタンで戻ってきたら、パスワードが長くなっている。Entityに変換する際にsetterが走ってしまい、パスワードがハッシュ化されていました。CakePHP3のチュートリアルにもあるようにパスワードのハッシュ化はEntityのsetterで行います。http://book.cakephp.org/3.0/ja/tutorials-and-examples/bookmarks/intro.html#id5この問題が発生した時に考えた対応策は次の3つになります。setterでハッシュ化を行わない。CakePHP2のようにbeforeSave()でハッシュ化するEntity化せず、リクエストデータをそのまま使うEntity化する際にsetterが走らないようにする。この対応策はどれも問題がありました。CakePHP3の書き方を制限してしまう。setterが使えなくなってしまう。Entity化しないとバリデーションをかけられない。バリデーションメッセージを表示するためにはEntity化した方が都合がいい。setterを走らせずにEntity化する方法はあるが、TableのFunction経由ではsetterを走らせずEntity化することができない。そこで無いなら作ってしまおう精神で作ったのがMultiStepFormです。MultiStepFormの特徴MultiStepFormの特徴は下記になります。目下の悩みはテストコードです。明日記事を書かれるhiromiさんのTransitionComponentを参考に書きたいなと思っています。Junkins/JpChronos次に紹介するのは、JpChronosです。用途は「和暦対応のChronos」です。使い方はこんな感じです。パラメータ文字列も同時に使いたいケースが多くいちいち文字列連結するのが面倒で作りました。話は逸れますが、FrozenDate、FrozenTimeを拡張して2つクラスを作成した方がいいかもしれませんね。このあたりのクラス設計が目下の悩みです。まとめCakePHP3のPluginも増えてはいますが、まだまだCakePHP2に比べると少ないなと感じます。これからPluginを増やして便利にしていければいいなと思います。14日目として投稿したものです。毎週水曜日Junkinsの日2日目でございます。初日や9日目の記事にも取り上げられた、Bakeです。Bakeは便利CakePHP3のBakeはカスタマイズが楽で重宝しています。Pluginとはまた違った形で開発効率の向上に寄与してくれます。Bakeのカスタマイズbakeをカスタマイズする場合は、TaskとTemplateをカスタマイズします。例として、ModelTaskを拡張してみます。ModelTask{}この時点でbakeコマンドを実行してみます。testJunkinsModelのタスクが実行できるようになっています。junkins_model下記のコマンドで通常のModelTaskと同じ処理が可能です。同じ名前のクラス名で定義するとBakePluginのタスクが優先されてしまいます。tableを無視してくれます。allオプションを指定する際などに便利ですね。--forceTemplatesrc/Template/Bake/Model/table.ctp継承元のクラスを変える変更をしています。Accountssrc/Model/Table/AccountsTable.php継承元のクラスが変更されました。'JunkinsModel/';}このように拡張するとBakeで作成するファイルを設置する場所を変更することができます。ClipsClipsTable.phpとClip.phpがJunkinsModel以下に作成されていることがわかります。先ほどの例では、下記のファイルパスにテンプレートをファイルを設置してテンプレートを作成しました。src/Template/Bake/Model/table.ctpただ、このままだと複数のテンプレートを使い分けることができません。その際に用いられるのが「テーマ」機能です。下記のパスでテンプレートを作成すると、下記のコマンドで作成することができます。Simple注意:SimplePluginはPluginとして使用出来る状態に設定する必要がある。イベントを設定することで、bake対象のtableごとに処理を分けることが可能です。1もっとも自由にカスタマイズできるクラスは「SimpleBakeTask」です。デフォルトで下記のクラスが準備されていますが、それ以外をBakeしたい場合はSimpleBakeTaskを使うと良いと思います。2016の方でCakePHP3に関しては書こうと思っているので、この記事ではCakePHP3以外の内容を書きたいと思います。この頃、見積り業務やプロジェクトマネージメントの業務を多く担当しています。大切なポイントこれらの業務を何度か担当するうちに下記の2つの業務をしっかりする事が大切だと感じます。観点の洗い出しタスクの洗い出し個人的な意見ですが、プロジェクト管理を行う上で「観点・タスクの漏れ」は非常に恐ろしいです。見積り段階で漏れていると赤字に、タスクの漏れがあるとお客様に迷惑をかけてしまいます。漏れを防ぐためには必要な観点・タスクだけでなく、やらない観点・タスクも洗い出す事が必要です。提案までの期間が短い場合もあるので、この作業をスピーディーに行う必要があります。個人的にマインドマップがしっくりきています。個人的に感じているマインドマップの利点は、各観点の関連性が明確になる点です。私が作成しているマインドマップを公開したいと思います。育て中ですが、このように観点や気をつける点をメモしています。自分なりのマインドマップを作成する方が良いと思います。自分でマインドマップを作成する過程で経験とひも付、ノウハウが整理されると思うからです。他の業務であっても一度、マインドマップを作成することをお勧めします。ちなみに私は、「XMind」というアプリを使っています。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に設定してインスタンス化を行っていますが。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。