Junkins今年のCakePHP3活動の一部
皆さんこんばんは。 この記事はの CakePHP3 Advent Calendar 2016 の21日目として投稿したものです。 毎週水曜日Junkinsの日3日目でございます。
私がCakePHP3を触って1年半になります。 今年はCakePHPに慣れてきたのでいくつかPluginを作成しました。 この記事ではPluginの紹介となぜ作った理由について書きたいと思います。
紹介するPluginは2つです。 まだまだ未完成なところもありますが、今年のまとめとして書きたいと思います。 よろしくお願い致します。
1. GitHub - Junkins/MultiStepForm
1つ目はMultiStepFormです。 用途は「複数ページの入力画面」です。 複数のタブで入力画面を開いた場合でも、タブを超えてデータが共有されないように作成しています。
作ったキッカケ
システム管理者を登録する複数ページの入力画面を作る際にこんな問題が発生しました。
戻るボタンで戻ってきたら、パスワードが長くなっている。。。。
理由は簡単でリクエストデータをEntityに変換してデータを保持していたのですが、(ついでにバリデーションもかけたいので) 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の特徴は下記になります。
- Marshallerを拡張して、setterを使わずEntity化できるクラスを作成
- ModellessFormにも対応
目下の悩みはテストコードです。 明日記事を書かれるhiromiさんのTransitionComponentを参考に書きたいなと思っています。
GitHub - hiromi2424/TransitionComponent: Transition component for CakePHP.
2. GitHub - Junkins/JpChronos
次に紹介するのは、JpChronosです。 用途は「和暦対応のChronos」です。
使い方はこんな感じです。
<?php $jpChronos = new JpChronos('1912-07-30'); $wareki = jpChronos->format({元号}{年}年m月d日); echo $wareki; // 大正元年07月30日
作ったキッカケ
今までは和暦変換のライブラリを別途作っていたのですが、上記の例のようにdate()のformat パラメータ文字列も同時に使いたいケースが多くいちいち文字列連結するのが面倒で作りました。
少し話は逸れますが、FrozenDate、FrozenTimeを拡張して2つクラスを作成した方がいいかもしれませんね。 このあたりのクラス設計が目下の悩みです。
まとめ
CakePHP3のPluginも増えてはいますが、まだまだCakePHP2に比べると少ないなと感じます。 これからPluginを増やして便利にしていければいいなと思います。