弊社もテストを導入しようといろいろと調査を進めてきたのですが、コントローラのアクションがテストしづらいという問題について次の手段を検討しています。
- Controller::setAction() を使って手続きを細分化する
- Component を使って手続きを細分化する
Component は言うに及ばず、 Controller::setAction() は苦心の末に思いつきました。
Controller::setAction() はアクションの途中から別のアクションを実行するためのメソッドです。 Controller::requestAction() との違いは Controller::setAction() でアクションを実行すると、フレームワークが「実行しているアクションが切り替わった」と認識する点です。一番わかりやすい違いが、 Controller::setAction() を使うとレンダリングされるビューが変わる点です。
たとえば次の場合…
function index()
{
$this->setAction("ordered_index");
}
レンダリングされるビューは orderd_index になります。さながら index アクションがフロントコントローラのような役割を果たしていると考えれば理解が早いと思います。
本題はテストです。こうやってアクションの役割を絞りつつ細切れにしていけばテストもいくらかやりやすいのではと思っています。現在開発中のアプリケーションで検証してみたいと思います。
遅ればせながら、第3回 CakePHP 勉強会のレポートをアップしたいと思います。
フェイス女学院
また新しい採用実績がひとつ増えました。顔写真を投稿すると統計から正確を算出して教えてくれるサービスです。解析周りは C++ で書いているらしいのですが、うまく PHP と連携されているようでした。中でもモックアップとしての利用に驚かされました。確かに CakePHP で動くアプリケーションは最強のモックアップかもしれません。
女性向けの雑誌やテレビ番組に PR されて、いくつかの媒体で取り上げられたとのことで、こういう動きは弊社でもやっていきたいと思いました。もちろん自分たちの利益になりますし、「あれ実は CakePHP なんだ」みたいな話をしてみたいです。
他にもここに書くのもはばかれる情報がたくさんありました。やはり勉強会に参加してのお話は貴重だと思います。
支持いただいた点
- メソッド名が直感的だった
- レイアウトが便利だった
- CMS 的な運営ができるようになった
困った点
- 最初、フレームワークという枠組みのとらえ方に迷った
- 独自の拡張子の取り回しに時間がかかった(たとえば Dreamweaver など)
- DEBUG が1以上でないとすべてのエラーメッセージが抑制されてしまう点に戸惑った
- コントローラのファイルが壊れるとすべてのアクションが動作しなくなる
ホッテントリメーカー@CakePHP
あの高名な pha 氏が考案し、稼働中のサービスについての発表でした。さりげなく著名人に会えるのも勉強会の魅力です。
やはり導入に困惑する部分はあったものの、アイデアの実現をとてつもなく困難にするような要素はなく、マッシュアップなど近年の技術との親和性を感じていただけたようで安心しました。これからも楽しいサービスを期待してしまいました。
支持いただいた点
- SQL を書かなくて良いところ
- 規約があって命名などに迷わない
- h() や pr() といった関数の存在
CakePHPゆとり開発環境
ちょっとトイレタイムに時間がかかってしまい、前半が聞けなかったのですが、 CakePHP を使う上での忌憚のない意見を聞くことができたと思います。やはり CakePHP を使っていると慣れやパッション(?)で気にならなくなってしまう点が多くあって、そういった問題点を再認識させていただきました。
困った点
- stable でない(最近 RC2 が出たばかり)
- MVC 間の移動が多い
提案いただいた点
- Cake のコアファイルを共有する(ちなみに弊社のシステムはやっています)
- 関連プラグインやコンポーネントなどを積極的に作る
- cakephp.el を使おう!
AuthComponent
AuthComponent と OpenID を絡めた認証処理の実装ノウハウです。書籍の執筆でしばらく 1.2 に触れられない時間が続いたのですが、この発表で AuthComponent のことが少しわかりました。結局 60 行程度のコーディングで必要な認証ロジックが実現できてしまうという点に驚かされます。
OpenID については PHP OpenID Library を使われていました。 CakePHP で使うためには若干の書き換えと、乱数ジェネレータ(デバイス)が必要とのことです。いずれ弊社でも使うことになると思いますので、そのときにでも情報発信できればと思います。
Cake にテストがやってきた
CakePHP でテストを実現する方法について教えていただきました。ちょうど「ウチでもテストを導入せねばなるまい」という発表の後でしたのでまったくジャストなタイミングでした。
CakePHP でテストを実現するためには SimpleTest との連携が必要とのことです。テストデータを自動生成する Fixture や、未実装メソッドの戻り値を見繕ってくれる MockObject など、導入のヒントになる情報もいただけました。
また、 CakePHP の不具合を報告する際に、テストケースを添付すれば英語が稚拙でも問題なかろうとのお話もありました。自分もなるべく開発に貢献したいと思いますので、テストは必修のようです。
CakePHP でテストするポイントとして次のような点に言及されていました。
- テストしやすいのは、モデルのバリデーションやコールバックや独自メソッド
- テストしにくいのは、コントローラ(その対策として、ロジックをコンポーネントなどに移動すると良いそうです)
私も緑あふれる CakePHP ライフを目指したいです(緑=テストにパスした時の色)。
何が違う? CakePHP and symfony
askeet の実装を題材に CakePHP と symfony との違いを解説いただきました。 CakePHP を symfony の土俵に上げるのに若干苦労されたそうです。
フレームワークの善し悪しを一概には決められませんが、それぞれには次のような特徴があるとのことです。
symfony の特徴
- 主キーに複合キーが使える
- ディレクトリ構成が広く深い
- 設定ファイルもディレクトリ構成下にある
- モデルの構築に対話シェルを使うことが現実的
- データのコンテナが配列ではなくオブジェクト
- 検索条件として Criteria オブジェクトを構築する
- ビューの変数はメソッドで受け取る
- ヘルパーの機能は関数で呼び出す(関数の名前がヘルパーの名前で修飾されている)
- 関連するデータの取得に join を指定することができる
- 対話シェルや IDE などのツールによる補助を受けることが望ましい
CakePHP の特徴
- 主キーに複合キーが使えない
- ディレクトリ構成がシンプル(フラット)
- 設定ファイルは core.php のみ
- モデルのコード記述量が少ない
- データのコンテナが配列
- 検索条件は配列で指定する
- ビューの変数はそのスコープに展開されている
- ヘルパーの機能はクラスのメソッドで呼び出す(ヘルパーの名前でインスタンス化されている)
- 関連するデータの取得に別のクエリを投げる
- エディタだけでの開発も問題ない
また、同じアプリケーションを作ったとき symfony より CakePHP (RC) の方が処理に時間がかかったそうです。パフォーマンスチューニングは共通の課題のようでした。
まとめ
CakePHP の採用実績が増えることに喜びを感じる一方で、 CakePHP の書籍を執筆させていただきながら、まだこれだけ新たに学ぶことがあるという現実を考えると、自分に対する不満があります。逆に考えると、もっと充実した情報を発信できる余地があると言うことですので、弊社のサイト運営や取扱商品に繋げていければと思います。
遅ればせながら、第3回 CakePHP 勉強会の発表資料を公開いたします。
勉強会では発表時間を大幅にオーバーしてしまい、甚大なご迷惑をおかけいたしました。関係者のみなさま、来場いただいたみなさま、誠に申し訳ありませんでした。
他のみなさまの発表はどれも大変興味ある内容となっておりました。リーガルパッドに書いたメモもいっぱいになってしまいましたので、後日、個々にレポートを公開させていただきます。
一番うれしかったのが、実務で CakePHP をバリバリ使ってらっしゃる方がいたことでした。弊社も研究開発や、今月公開予定のコンテンツでは CakePHP を採用しているのですが、客先に納品するような本格的なアプリケーション開発での採用実績はとても心強く感じました。個人的には業務を改善するための手段として CakePHP を使っていただけるのが一番うれしいので、そういった採用実績はユーザ冥利に尽きるというものです。
タイミング良くテストと Auth コンポーネントのお話が聞けたのはラッキーでした。なんだか、得るものばかり多くて与えられるものが少なかった気がします。うーむ、日々これ精進ですね。
特に PHP での開発において Set クラスは一押しです。そのファイルだけ抜き出して他の開発にも使いたいほどです。後日、ブログと eBook にて情報公開させていただきます。