4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CakePHPAdvent Calendar 2014

Day 5

CakePHPでType Hinting!!!

Last updated at Posted at 2014-12-05

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を記述することができます。

PHPマニュアル タイプヒンティング

    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ができるようになればいいなと思います。

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?