CakePHPでType Hinting用のPluginを作成しました。
こんばんは@Junkinsです。
Jenkinsと紛らわしいですよね。でもこれ本当に高校時代のあだ名なんです...
この記事ではCakePHPでType Hinting用のPluginを作った話をします。
Junkins/Tongue
Controlleのactionでのエラーチェック
Controllerでactionの引数に対してこんなエラーチェックを行うと思います。
この引数はユーザーが直接入力することができるパラメータなのでチェックは必須です。
class PostsController extends AppController {
public function view($id) {
if (!is_numeric($id)) {
throw new NotFoundException(__('Invalid post'));
}
$post = $this->Post->findById($id);
}
}
毎回チェックの条件を記述して例外を投げるのはめんどくさいですよね。
なんとか簡単に実現できないかと色々方法を考えました。
最初はアノテーションに引数の型を記述する方法を考えましたが、最終的にType Hintingで実現する事にしました。
PHPでのType Hinting
PHP5ではType Hintingが導入されました。
こんな感じでType Hintingを記述することができます。
public function test(OtherClass $otherclass) {
echo $otherclass->var;
}
しかし、PHPではクラスや配列のチェックしかできず、intや stringといったスカラー型には使えません。
一旦ここで諦めかけたのですが、JavaScriptのStringクラスやNumberクラスの様に、スカラー型をクラスで表現できないかなと思いました。
Tongue Plugin
Type Hintingを実現するために作ったPluginがTongue Pluginです。
引数を指定されたクラスに変換してチェックしています。
(強引ですよね...毎回インスタンスを作成します)
使用例
public $components = [
'Tongue.Tongue'
];
public function view(TNumeric $id) { // <= TypeHinting!!!
$post = $this->Post->findById($id);
$this->set(compact('post'));
}
引数のすぐ近くに型を指定することができるので手軽かなと思います。
named-parametersとかはどうするの??
えっ知らないよ!!だってType Hintingがしたいだけだもん。
普通にスカラー型のType Hintingができるようになればいいなと思います。