CakePHP3をはじめて触ったときに読んだものをまとめておく

このエントリは、 [コネヒト Advent Calendar 2019](https://qiita.com/advent-calendar/2019/connehito) の19日目のエントリです。


# はじめに

今年7月にコネヒトに入社しまして、5ヶ月ほど経過しました [@takoba](https://twitter.com/takoba_) です。

コネヒトではサーバーサイドの主要言語としてPHPを採用しており、その上で採用しているアプリケーションフレームワークは [CakePHP](https://cakephp.org/jp) です。一方でぼくは、PHPの経験こそあれど入社するまでCakePHPを触ったことがありませんでした。

先日、同じような書き出しで [所感エントリ](http://takoba.hatenablog.com/entry/feeling-cakephp3) を書いたのですが、今回はCakePHPにはじめて触った際に、理解を進めたりするために読んだものをご紹介しようと思います。


# 前提

## 筆者のおおよそのスペック

- PHPは8年以上経験
    - 基本LAMP環境で触ってきた
    - CodeIgniter v1（PHP5.4）でのアプリケーション開発経験を3年ほど
    - Zend Framework v1（PHP5.3）でのアプリケーション開発経験が3年ほど
    - Laravel v5（PHP7.1）でのアプリケーション開発経験が半年ほど
- その他、主に以下を経験
    - Ruby on Rails v4
    - Vue.js v2


# 読んだもの

## CakePHP Cookbook

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9856/d2748247-c7fc-9641-0a2d-95074b09b4e8.png)
https://book.cakephp.org/3/ja/index.html

公式のドキュメントです。概要から細かいリファレンスまで諸々書いてあります。
一通り日本語訳もなされているので、「英語が苦手で...」という方も安心です。

個人的によく読んだトピックを以下に挙げてみました。
サンプルコードなどを見て「なんとなく書けるかな〜〜」というところから自らが実現したい処理を書けるようになるためには、ツールの詳しい使い方を知る必要があると思います。そんなときに役に立った印象です。

- [エンティティー - 3.8](https://book.cakephp.org/3.0/ja/orm/entities.html)
    - アプリケーションコード内で [仮装プロパティ](https://book.cakephp.org/3/ja/orm/entities.html#entities-virtual-properties) を見かけて「なんだこれ？？」と思って調べた記憶が
    - あと、APIを実装するときに [JSONへの変換](https://book.cakephp.org/3/ja/orm/entities.html#json) ってどうしてんだろ？？みたいな気持ちで調べました
- [クエリービルダー - 3.8](https://book.cakephp.org/3.0/ja/orm/query-builder.html)
    - 発行したいSQLをどうやって表現すべきか、めちゃくちゃこのページとにらめっこしてましたね...
- [データベースの基本 - 3.8](https://book.cakephp.org/3.0/ja/orm/database-basics.html)
    - [トランザクションをどう実装するか](https://book.cakephp.org/3/ja/orm/database-basics.html#id11)を探してたらここにたどり着きました
- [テスト - 3.8](https://book.cakephp.org/3.0/ja/development/testing.html)
    - [Controllerのテスト](https://book.cakephp.org/3/ja/development/testing.html#integration-testing) や [Tableクラスのテスト](https://book.cakephp.org/3/ja/development/testing.html#id18) あたりは頻出なのでちょくちょく読んでた気がします 
- [エラーと例外の処理 - 3.8](https://book.cakephp.org/3.0/ja/development/errors.html)
    - この辺の機構が割とメタ的に（というかフレームワークでだいぶよしなにしてくれるように）書かれてたりするので、仕組みを知りたくて読んでました


## インターネット上のエントリ

この場を借りて、めちゃくちゃお世話になりましたので御礼申し上げます...🙇
具体的な問題にハマったときだけではなく、「あれ？この機能って普通どう使うんだろう？？」みたいなtipsや「こういう実装を実現したいとき、何を使うとよいのだろう...」といったフレームワークを用いた実装パターンを捉えるのにも役に立った印象です。

以下に、手元に保存してあったエントリをいくつか置いといてみるんですが、見事にQiitaのエントリばかりでした...Qiitaさすが...

- [CakePHP 3のQueryBuilderの使い方をまとめてみた！ - Qiita](https://qiita.com/kozo/items/87dc9f725e71dd742468)
- [CakePHP3でデータベースのトランザクションを使う - Qiita](https://qiita.com/SRsawaguchi/items/89394b907b1eac4fe101)

また、CakePHPのアドベントカレンダーにもめちゃくちゃお世話になってました。機能の紹介やCakePHPを用いたアプリケーションの設計方針など、参考になるエントリがたくさんです。
来年はひとつくらいエントリ書いて貢献できるとよいなあ...

- [CakePHP Advent Calendar 2014 \- Qiita](https://qiita.com/advent-calendar/2014/cakephp)
- [CakePHP Advent Calendar 2017 \- Qiita](https://qiita.com/advent-calendar/2017/cakephp)
- [CakePHP Advent Calendar 2018 \- Qiita](https://qiita.com/advent-calendar/2018/cakephp)
- [CakePHP Advent Calendar 2019 \- Qiita](https://qiita.com/advent-calendar/2019/cakephp)

## コーディング規約

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9856/8cf3e5be-6ec4-a18d-19a6-3943edf96fdd.png)
https://book.cakephp.org/3/ja/contributing/cakephp-coding-conventions.html

CakePHP3は [PSR-2](http://www.php-fig.org/psr/psr-2/)[^1] をベースにしたコーディング規約を定義しています。

[cakephp/cakephp-codesniffer](https://github.com/cakephp/cakephp-codesniffer) という、上記のコーディング規約に準拠するための [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) 向け設定もあるので、IDEに組み込んだりcommit前に実行するようにして、規約にそったコーディングをするようにします。
その上で、上記のようなフォーマッターに指摘されないようなコーディングをするために、ざっと内容を読みつつ実践できるようにしていきました。

最初、自社のアプリケーションにPull Requestを投げた際には、コーディング規約を踏まえた変更になっておらず、レビュアーにコードフォーマットに関する指摘をさせてしまいました...
コードフォーマットの指摘も度々レビュアーのコストになってしまうので、ツールに頼ったりしつつ事前にコーディング規約の検査をしておかないといけないですね。

## フレームワーク自体のソースコード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9856/e3775091-16b0-d2b6-858e-c75fb9b5d70b.png)

正直、ホントに困ったときはこれが一番です。フレームワークが提供しているクラスや関数が、受け取る引数によってどのような振る舞いをするのかは、実際にその定義を読んだり実行してみたりすることで理解が深まります。

手元にCakePHPで作られたプロジェクトがあれば、その中にあるControllerクラスなどの実装から辿っていくとわかりやすくてよいです。
もしそういうプロジェクトが手元にない場合、GitHubに公開されているCakePHPのサンプルアプリなどでとりあえず補ってみてもよいかもしれません。

ちなみに、以下は [ぼくが知ってる書籍](https://www.amazon.co.jp/dp/479804749X/plane25-22/) のサンプルコードがホストされてるレポジトリです。実際にlocalで動かしながら観察できるので、オススメです👀
https://github.com/php-book/php-qa-plaza/

### 定義元ジャンプ機能を有効活用

![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9856/99c19e01-90a5-3975-ad1a-be32f4ad81f4.gif)

ソースコードリーディングをする場合、IDEなどにある「定義元ジャンプ機能」を用いると、とっても捗ります。
ぼくはコネヒトに入ってから、 [PhpStorm](https://www.jetbrains.com/ja-jp/phpstorm/) をメインで使うようになりましたが、プロジェクトのディレクトリをIDEで読み込んで置いて、`composer install`をしてパッケージを落としておけば、採用しているパッケージ側の定義までサクサク読みにいけます。
もともとvimをメインで使ってて、vimでも [universal-ctags](https://ctags.io/) を利用すれば定義元ジャンプはできるのですが、PhpStorm（IntelliJ）にはここでは語り切れないたくさんの機能があり、そういうのを含めて「やっぱりIDE便利やな...」ってなっている昨今です。

## 番外編： `cake console`コマンド（インタラクティブコンソール）

とはいえ、ソースコードを読むだけだと、具体的な挙動については頭の中で想像するしかありません。手元にCakePHPで作られたプロジェクトがあるならば、その中に組み込まれているインタラクティブコンソールを利用すると具体的に動作が確認できて便利です。

[インタラクティブ・コンソール \(REPL\) \- 3\.8](https://book.cakephp.org/3/ja/console-and-shells/repl.html)

例えば、「[FrozenTime](https://book.cakephp.org/3/ja/core-libraries/time.html#immutable-time)で使えるmethodを雑に確認したいな〜〜」ってときに、`bin/cake console`コマンドを実行して、以下のようなかんじに確かめられます。

```
>>> use Cake\I18n\FrozenTime
>>> new FrozenTime
=> Cake\I18n\FrozenTime @1576723101 {#2520
     date: 2019-12-18 20:38:21.933676 Asia/Tokyo (+09:00),
   }
>>> (new FrozenTime)->subDays(5)
=> Cake\I18n\FrozenTime @1576291118 {#2522
     date: 2019-12-13 20:38:38.390307 Asia/Tokyo (+09:00),
   }
```

実際にORMを用いてクエリも実行できるので、サクッと検証したい場合も便利です。

# おわりに

挙げてみたら、思ったほどCakePHPに限らず"新たなアプリケーションフレームワークを触るときに読むとよさそうなもの"としても捉えられそうかな？と思ったので、他のアプリケーションフレームワークを触るときにも上記に倣って学んでいこうな！と思った次第です。

というわけで以上になります！新たにCakePHPを触るみなさんの参考になれば幸いです〜〜😇

＊

[PR] エンジニア絶賛募集中です！！！
<a href="https://www.wantedly.com/projects/295096">
  <img src="https://d2v9k5u4v94ulw.cloudfront.net/small_light(dw=1956,dh=796,da=s,ds=s,cw=1956,ch=796,cc=FFFFFF)/assets/images/3594470/original/3183c232-b217-4820-9d5f-a3e93c4350e9?1552985561" alt="Connehito Image">
  <span>PHPとAWSで開発！生活領域における課題を解決したいエンジニア募集！</span>
</a>

＊

[PR] 弊社で採用している開発環境を参考に書かれたCakePHP本もよろしくな！！！
（こちらもCakePHP3をはじめて触る方にオススメです！）

[TECHNICAL MASTER はじめてのPHPプロフェッショナル開発 PHP7対応 \| 伊藤 翔, 金城 秀樹, 高野 福晃, 永井 勝一郎 \|本 \| 通販 \| Amazon](https://www.amazon.co.jp/dp/479804749X/plane25-22/)


[^1]: ちなみにPSR-2はすでにdeprecatedになり、新たに [PSR-12](https://www.php-fig.org/psr/psr-12/) を利用することが推奨されています。CakePHPも [4.0.0の時点ではまだPSR-2準拠のままになっている](https://book.cakephp.org/4/ja/contributing/cakephp-coding-conventions.html) ようですが、 [cakephp/cakephp-codesniffer](https://github.com/cakephp/cakephp-codesniffer) を眺めてみると4.0.0に向けたbranchではPSR-12に準拠するための準備が始まっているようです。今後に期待！