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つになります。

  1. setterでハッシュ化を行わない。CakePHP2のようにbeforeSave()でハッシュ化する
  2. Entity化せず、リクエストデータをそのまま使う
  3. Entity化する際にsetterが走らないようにする。

ただこの対応策はどれも問題がありました。

  1. CakePHP3の書き方を制限してしまう。setterが使えなくなってしまう。
  2. Entity化しないとバリデーションをかけられない。バリデーションメッセージを表示するためにはEntity化した方が都合がいい。
  3. setterを走らせずにEntity化する方法はあるが、TableのFunction経由ではsetterを走らせずEntity化することができない。

そこで無いなら作ってしまおう精神で作ったのがMultiStepFormです。

MultiStepFormの特徴

MultiStepFormの特徴は下記になります。

  1. Marshallerを拡張して、setterを使わずEntity化できるクラスを作成
  2. 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を増やして便利にしていければいいなと思います。