コネヒト開発者ブログ

コネヒト開発者ブログ

社内ツールをCakePHP4でつくりました

f:id:itosho525:20170430222524j:plain

こんにちは。CTOの@itoshoです。

夏の甲子園が始まっていますね。ランチの時間はSPORTS BULLさんのアプリでバーチャル高校野球を観ています。 というわけで、フレッシュな高校球児に負けないようにフレッシュなCakePHP4で社内ツールをつくった話をしたいと思います。

なぜ、CakePHP4でつくったの?

現在、コネヒトのバックエンドのシステムはCakePHP3系が主流になっています。サービスが拡大していく中で今後他の言語やフレームワークを導入していく可能性はありますが、社内にPHP及びCakePHPのナレッジが蓄積されているので、当面CakePHPがコネヒトの技術スタックの主軸の一つであることは変わらないと考えています。そうすると、CakePHP3からCakePHP4へアップグレードしていくのは当然の流れですので、早めにCakePHP4を触っておきたいと思いました。

しかし、CakePHP4はまだstable版がリリースされておらず、4.0.0 beta1が最新のバージョンになります。*1ですので、もちろんプロダクション環境への導入はリスクがあります。しかし、社内ツールであればある程度そのリスクを許容することが出来ますし、むしろ、バグを踏めばCakePHPにコントリビュート出来るチャンスがあると考え、今回CakePHP4を採用することにしました。

どういうツールをつくったの?

この社内ツールについては、また別の機会に詳しく紹介したいと思いますがつくったものは以下のようなシンプルなwebアプリケーションです。

  • 画面数: 12
  • テーブル数: 5
  • 機能のほとんどがシンプルなCRUD処理

隙間時間で開発していたので完成するまで1ヶ月弱くらいかかりましたが、ガッツリ時間を取ることが出来れば2〜3日で完成出来るボリュームかなと思います。

CakePHP4どう?

上述の通り、ほとんどの機能がbakeの自動生成してくれるコードに毛が生えたレベルで、ガッツリ使い倒したわけではありません。ですので、今後また別の印象を持つかもしれませんが、一つのwebアプリケーションをつくった印象としては「CakePHP3に慣れていれば、すんなり入っていける」と感じました。

そして、CakePHP4.0のロードマップを読むと、冒頭に以下のような記述があります。

CakePHP 4.0 will be a breaking change from 3.x. Unlike 3.0, 4.0 will primarily be a clean-up release. Instead of introducing large backwards incompatible changes, 4.0.0 will focus on removing all the deprecated features we've accumulated throughout the life of 3.x. Any method/feature emitting run-time warnings in 3.6 will be removed from 4.0. 4.0 will not add significant new features as the bulk of the release will be spent on cleanup efforts.

要約すると、4.0は2系から3系の時のような破壊的な変更をせず、非推奨機能の削除を中心に行い、後方互換性のない新機能は次の4.1で行うという方針になっています。つまり、4.0は4系にソフトランディングするためのリリースになっているので「すんなり入っていける」という感想を持つことが出来たというわけです。*2

その上で「おっ!」と思ったところを簡単に紹介します。

  • テンプレートファイルがctpファイルからphpファイルになった
    • おそらく一番最初に気付くのがこの変更ではないでしょうか。拡張子が変わっただけかもしれませんが、PHPStorm使いとしては特別な設定をせずに、PHPファイルとして扱えるようになりました。
  • デフォルトレイアウトにMilligramが採用された
    • Milligramは何度か使ったことがありますが、軽いし、デザイン性も高いし、カスタマイズもしやすいので個人的には嬉しい変更でした。
  • リソースのルーティングのルールが一部変更になった
    • 複数の単語からなる、例えば TodoItemsController を作成した場合、これまでは todo_items というルーティングでしたが todo-items というルーティングになりました。なお、これまで通りアンダースコア形式にしたい場合はオプションで 'inflect' => 'underscore' を指定します。
  • (bakeでコードの自動生成をすると)戻り値の型を宣言するようになった
    • 個人的にはこれが一番嬉しいなと思いました!別に元から書こうと思えば書けたのですが、これまでCakePHP本体が戻り値の型宣言をしていなかったので、それに追従する形でコネヒトではアプリケーションコード側も書いていなかったのですが、CakePHP4からは気にすることなく戻り値の型も宣言出来ることになりそうです。
  • (bakeでコードの自動生成をすると)strictモードが指定されるようになった
    • これもよりタイプセーフなコードを実現するための一環ですね。strictモードの挙動については以前Qiitaにまとめた記事があるので、もし興味があれば併せてご覧ください。
  • newEmptyEntity() メソッドの登場
    • これまで新しくEntityを作成する時は newEntity() メソッドを利用していたのですが、bakeで自動生成されるコードをみると今後は newEmptyEntity() メソッドを利用するほうがベターのようです。文字通り空のEntityを作成するメソッドなのですが newEmptyEntity() メソッドとの違いはEntity生成時にバリデーションを行うか行わないかの違いがあります(newEmptyEntity() メソッドはバリデーションを行わない)。

いますぐCakePHP4を使うには?

ここまで読んで、今すぐ私もCakePHP4を使ってみたい!と思ってくれた方は、以下のコマンドでプロジェクトの作成が可能です。ちなみに、CakePHP4からPHP7.2以上が必要条件になっていますのでご注意ください。

$ composer create-project --prefer-dist cakephp/app:4.x-dev app

冒頭に述べましたが、CakePHP3に慣れていれば、すんなり入っていけますし、上記に挙げたようなよりよい改善も含まれているのでstable版が出たら、プロダクションコードもなるべく早めにアップグレードしていきたい!という気持ちを新たにしました。また、これはCakePHP4に限った話ではないですが、やはりちょっとしたプロトタイプ的なwebアプリケーションをつくりたい時に非常に低コストで出来る点は改めて最高だなと思いました。*3

というわけで、今後もCakePHPと共に「人の生活になくてはならないもの」をつくっていくぞ〜!一緒につくってくれる仲間も絶賛大募集中です!

参考サイト

*1:2019年8月13日現在

*2:言うは易く行うは難しだと思うので、これを実現してくれているCakePHPコアチームの皆さんは本当に凄いと思います。

*3:実は当初Go×ReactでSPAっぽくつくろうと思ったのですが、つくりたいものに対して若干オーバーエンジニアリング感があったので、辞めたという経緯があります。