読者です 読者をやめる 読者になる 読者になる
一人もくもく会 α verでサービス開始しました。

CakePHP3の優位性を色々

はじめに

この記事は下記の1日目としての投稿。

CakePHP3 Advent Calendar 2016 - Qiita

昨今は様々なphpフレームワークがある。Laravelとかは最近流行ったりしていて色々触ってみるが、 自分はやっぱりCakePHP3に帰ってきてしまう。それだけ便利で楽だからだ。

他のフレームワークには慣れているけど、CakePHPはなんか古臭くて触ってない、という人も是非一度使って見てほしい。 離れられなくなるはず。 CakePHP2以前しか使ったことがない人も一度触ってみてほしい。

では何が一体そんなにいいのか、色々と述べてみる。

ルーティングなんて設定しない

設定しない。するとしてもprefixルーティングくらい。 コントローラとテンプレートがあれば設定しなくてもアクセスできる。

もちろん、他に変えたければできる。

<?php
Router::connect(
    '/articles/:id',
    ['controller' => 'Articles', 'action' => 'view'],
    ['id' => '\d+', 'pass' => ['id']]
);

しかもテンプレート上で普通にヘルパーでリンクを作ると、勝手に設定したURLに置き換えてくれる。 変更後等もわざわざテンプレート側の調整等するのは古い時代のフレームワーク群の話。

<?= $this->Html->link(
    '閲覧する',
    ['controller' => 'Articles', 'action' => 'view', $acticle->id]
) ?>
出力: <a href="/acticles/5">閲覧する</a>

高性能なDebugKit

こんな便利なデバッグバーは他にはない。デザインも秀逸で見やすく扱いやすい。

f:id:dala:20161124214922p:plain

一番下にバーがあり、各タブをクリックすると全画面でデータが表示される。これが一番ベストだと気づいた。 CakePHP2のデバッグキットや他のフレームワークのもの等は、 下などに中途半端なサイズでドッキングしていてなんとかウィンドウにカーソルを合わせてサイズ調整したり、 両方狭い状態で操作したりするのはストレスになるだけで完全に時間の無駄だった。

テンプレートにsetされた変数はここで見られる。非常に見やすい。 f:id:dala:20161124215209p:plain

SQL

f:id:dala:20161124215425p:plain

時間やメモリ使用の流れも見られる。

f:id:dala:20161124215541p:plain

その他定数定義やrequestオブジェクトの中身、セッション等も見られる。 一度慣れたら他のフレームワークで開発する気にはなれない。

ORMがすごい

<?php
// シンプルな例。別にすごくはない。
$articles = $this->Articles->find()
foreach ($articles as $article) {
    $article->title;
}

// 実は$articlesはQuery。配列じゃない。なので使いまわせる。
$allCount = $articles->count();
$articles->where(['category_id' => $categoryId]);
$countInCategory = $articles->count();
// ResultSetに変換
$this->set("articles{$categoryId}", $articles->all());
// 配列に変換
$this->set("array{$categoryId}", $articles->toArray());

echoするとクエリになるのでそのままサブクエリで使える。

<?php
$sub = $this->Articles->Comments->find()
    ->where([〜〜〜〜]);
$articles = $this->Articles->find()
    ->where(["($sub) > 5"]);

それぞれのデータはEntityなので例えば下記のようなメソッドを追加すると

<?php
protected function _getDisplayName()
{
    if ($this->private) {
        return '非公開';
    } elseif ($this->company) {
        return $this->company;
    } elseif ($this->name) {
        return $this->name;
    }
    return '未登録';
}

テンプレートは下記だけでいい。今の時代フレームワークを使ってるのに同じif文を複数のテンプレートに大量に書くなんてことはまさかしないだろう。

<?= $article->user->display_name ?>

あと別にすごくない、フレームワークとしてごく当たり前の話なのだが、 Laravelのようにリレーションしたテーブルのカラム名が被っている場合に上書きされるなんてことはない。

bakeでコード生成

昔はコントローラもモデルも自分で一から書いてもさほど変わらない、というところがあったが、 今は設定なども増えて便利になっているので、bakeするのがかなり効率的。というかコントローラとモデルはすべてbakeで作るべき。 テストの雛形も作ってくれるし、そもそも記憶を頼りに適当に作ると変な設定を書いてエラーになってしまったりする。

モデル

TableとEntityが作られる。

Tableでは基本的な設定、コンポーネントのロード、DBを元にしたカラムやリレーションの設定、 バリデーション、データチェックの設定などが自動で作成される。 NULLでないカラムは必須項目に設定されたり等する。

Entityは特にたいした設定は行われないが、 passwordカラムがあったりするとjson_encodeした際に含まれないような設定を追加してくれていたりする。

コントローラ

特に設定しなければCRUDアクションが勝手に作られる。 特に拘り不要の管理画面などであればbakeだけで作れるし、 そうでなくてもベースに使えるのでかなり楽。

テンプレート

こちらもbakeで作成したコントローラそのままで使ったりするのであればそのまま使える。 Bootstrapのプラグインもあるのでそちらを使うことも可能。 まあテンプレートは必要であれば使う、と言ったところか。

その他

なんでもかんでもbakeで雛形を作ってくれる。 コマンドオプションも色々見てみると楽しい。

APIとしてjsonを使いたい時

デフォルトでは特に何もする必要はない。普通にindexとかviewのアクションにAcceptヘッダーとしてapplication/jsonを送ればhtmlでなくjsonが返ってくる。

URLを変えたり状況によってjson用のresponseをreturnしたりするコードを書くのは昔の時代のフレームワークの話。もちろんそういったこともできる。

(実際にはそういった設定があるのだが、初期化時点でその設定のコードが入っている)

マイグレーションの便利な機能

phpMyAdminで適当にテーブルを構築しておけば、コマンド一発でマイグレーションファイルを作ってくれる。すごく楽。 稼働中のプロジェクトにマイグレーションを途中から導入することも問題ない。

自分で書いて、抜けが見つかったらrollback&migrateでテスト中のデータとか一旦空になったりとか、面倒じゃないんだろうか?

初期化。

bin/cake bake migration_snapshot Initial

差分のマイグレーション作成

bin/cake bake migration_diff NameOfTheMigrations

マイグレーションファイルが増え過ぎたらマイグレーション関連データとファイルを削除してまたsnapshotすれば1ファイルにまとまる。

まとめ

他にもアソシエーション関連機能は便利だし、優位性関係なく非常に便利な機能が揃っている。

やっぱり仕事を早く効率的に終わらせたいなら、phpフレームワークの中ではCakePHP3が一番いいのではないかと思う。(個人的意見)