初心者が語るフレームワークの違いと魅力　~CakePHPとLaravel~

# 自己紹介
これは[ランサーズ Advent Calendar 2021 24日目](https://qiita.com/advent-calendar/2021/lancers)の記事です。

こんにちは！
24日、クリスマスイブの記事を担当しますのは、Lancersでエンジニアインターンをしている高橋宏和です。


私は2021年3月から10ヶ月ほどインターンを行なっており、以下の開発を経験させていただきました。

- **3月〜10月: CakePHP**🍰 
 - 管理画面
 - バッチ
 - [lancers.jp](https://www.lancers.jp/)

- **10月〜12月: Laravel**
 - [Menta](https://menta.work)

Web開発初心者がCakePHPとLaravelによる開発を経験してみて感じた違いと、これいいなと感じたことを僕の主観に基づいて率直にまとめています。フレームワークとしてのCakePHPとLaravelの違いだけでなく、LancersとMentaの開発の違いにも少し触れていきます。

CakePHPの方が触れていた期間が長かったこともあり、若干思想が偏っていますが、どちらが優れているのかを述べたいのではなく（そもそもそんなものはない）、どのような魅力・強みがあるのかを紹介するために書いています。

追記）社内でこの記事のレビューをお願いしたところ、たくさんの意見をいただき盛り上がったので補足として記載しました。

# 目次
[1.ドキュメント](#1-ドキュメント)
[2.Debug](#2-debug)
[3.ORM・データ操作](#3-ormデータ操作)
[4.先進性・自由度](#4-先進性自由度)


#1 ドキュメント
[CakePHP](https://book.cakephp.org/4/ja/index.html)
[Laravel](https://laravel.com/) ([日本語訳サイト](https://readouble.com/laravel/6.x/ja/))

|CakePHP|Laravel日本語訳ドキュメント|
|:------------:|:------------:|
|<a href="https://book.cakephp.org/4/ja/index.html"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298343/c84483d7-4c63-adc2-4ce5-903cc8646a3e.png" width="100%"><a/>|<a href=""><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298343/afc6775e-08c9-1c90-5508-f9614431d6ca.png" width="100%"><a/>|

フレームワークを使っていれば必ず公式ドキュメントを見ることにはなると思いますが、ドキュメントは**CakePHPの方がデザイン的に見やすく、説明が丁寧**です。
[laravelの公式ドキュメント](https://laravel.com/)は英語のみであるため、公式ドキュメントを[日本語訳しているサイト](https://readouble.com/laravel/6.x/ja/)を読むことが多いです。しかし、Laravel日本語訳[翻訳方針](https://github.com/laravel-ja/ja-docs-8.x#%E7%BF%BB%E8%A8%B3%E6%96%B9%E9%87%9D)にある通り公式ではないため、公式ドキュメントの補助的な立ち位置と考えるのが良さそうです。

説明が丁寧という点では、例えば、コントローラーの冒頭の説明を比較すると
**Laravel**

>すべてのリクエスト処理ロジックをルートファイルのクロージャとして定義する代わりに、「コントローラ」クラスを使用してこの動作を整理することを推奨します。コントローラにより、関係するリクエスト処理ロジックを単一のクラスにグループ化できます。

こちらは玄人向けで、よりフレームワークを便利に本質的に使うための内容となっているようです。

**CakePHP**

> class Cake\Controller\Controller
コントローラー (Controller) は MVC の 'C' です。ルーティングが適用されて適切なコントローラーが見つかった後、 コントローラーのアクションが呼ばれます。

MVCについて具体例を挙げながらwebフレームワークのベースとなる考え方まで詳しく解説しており、初心者でも理解しやすいです。

### 公式ドキュメントの印象
- Laravel : 多機能で玄人向け。初学者的な内容は別途調べて補完する必要がある。
- CakePHP : 初学者も含めた広いユーザー向け。

ちなみに、ランサーズSREの金澤さん（@ykanazawa）はCakePHP公式ドキュメントの日本語化のコントリビューターになっています。

:::note info
社内の意見
Laravel 
公式ドキュメントはある程度の理解が前提に書いてある印象
多機能であるがゆえか、初学者向けの解説は数多く出版されている書籍を見るのがベストなのかもしれない

CakePHP 
公式ドキュメントが手厚く、日本語化も充実している
反面、必要最低限の機能提供に止まり、プロダクトやプロジェクトの性質により開発者自身が応用していくスタイル
:::

#2 Debug

- debugKit
- debugでよく使うメソッド

の二つの点で比較します。

## debugKit

これに関してはCakePHPの方が優れているといえると思います。
具体的に挙げるとすれば、CekePHPでは以下の点で恩恵を強く感じていました。

- requestの内容(POST,GET)がDebugBarから確認できるのが強い（Laravelもできるけど見にくい）
- 発行されているSQLが整形されて表示されるので見やすい
- その他、確認できる項目がLaravelよりも多い、かつ見やすい


ただ、私は使ったことがないですが、Laravelには[Laravel Telescope](https://readouble.com/laravel/8.x/ja/telescope.html)というものがあるらしく、なかなか良さそう。

## debugでよく使う関数
**CakePHP**
CakePHPではdebug()をよく使っていました。この関数はviewのある実装でもAPIのような実装でもどちらでも使うことができ、**呼ばれた場所となるファイルと行番号も出力してくれる**ため、非常に便利です。また、インデントを揃えて出力してくれるので見やすいです。

```PHP:exampleController.php
// Usersの一番目のデータをデバッグで見てみる
$users = $this->Users->find()->first();
debug($users);
...
```
画面上部にこれが表示される

```php
APP/Controller/LancersUsersController.php (line 2)
　　　　object(App\Model\Entity\User) id:0 {
    'id' => (int) 245
    'name' => 'suikun'
    'email' => 'suikunKakkoii@pokemon.co.jp'
    'deleted' => (int) 0
    'created' => object(Cake\I18n\FrozenTime) id:1 {
        'time' => '2021-12-24 01:23:45.000000+09:00'
        'timezone' => 'Asia/Tokyo'
        'fixedNowTime' => false
    }
    '[new]' => false
    '[accessible]' => [ ]
    '[dirty]' => [ ]
    '[original]' => [ ]
    '[virtual]' => [ ]
    '[hasErrors]' => false
    '[errors]' => [ ]
    '[invalid]' => [ ]
    '[repository]' => 'Users'
}
```
**Laravel**
debugに使うメソッドはCakePHPよりも豊富にあります。
が、私はPHPでよく使われているdebug用のメソッドである2つ＋Laravelのメソッド１つしか基本的に使っていませんでした。
気になる方は「[Laravelでのデバッグ方法4パターンまとめ](https://qiita.com/rarrrrsQ/items/34f3867bbcb17604e136)」を確認してみてください。

```php:よく使うメソッド
// 画面上部に表示
dd($hoge);
v_dump($hoge);

// debugBarのmessageに表示
debug($hoge)
```

参考
[Laravelでのデバッグ方法4パターンまとめ](https://qiita.com/rarrrrsQ/items/34f3867bbcb17604e136)
[【CakePHP】printfデバッグ用のメソッドまとめ](https://qiita.com/kazu56/items/9d5d3872b03199b8d5ea)


#3 ORM・データ操作

Laravelには**Eloquent**という非常に優秀なORMが入っています。
個人的に一番旨みを実感したのは、クエリビルダーのメソッドの豊富さでした。
CakePHPではデータ抽出の条件を設定するとき、`where()`メソッドのみ利用していましたが、
Laravelでは`whereDate()`,`whereBetween()`,リレーション先のデータを検索する`whereHas()`など、痒いところまで手が届いたメソッドが用意されています。

気をつけておきたいのは、このようなORMは非常に便利ですが、実際に発行されているSQLを意識しなくなることに繋がるため、**スロークエリ生んでいないか**、**indexを貼るべきではないか**、といった点には注意を払う必要があります。

Lancers管理画面・バッチ開発では、リレーションを参照したい時にはなるべくアソシエーションを用いず、joinメソッドを利用することが推奨されていました。これにより、発行されているSQLを意識しやすくなり、結果としてスロークエリ防止などのメリットも生まれています。

DBのエキスパートであり私の師でもある間宮さん(@mamy1326 )から、インターンを始めたての時にいただいたslackメッセージを肝に銘じて開発してます。

>（CakePHPのリレーション参照に関して）
ORM として開発しやすくした結果、本来 1 個の SQL で取ると想定していても分割されて実行されることもあって。
そうなると n+1 問題が意図せず発生する弊害もあるんだよね。
で、これは ORM としては正しいと思っていて、コードを書く側は SQL を意識しなくても良いように作られている。
使いこなすとめっちゃ便利だけど、難点もあって。
SQL を意識しなくなる＝n+1 やスロークエリが仕込まれやすい＝DB サーバーの負荷上昇につながることが結構ある。
負荷上昇を起こさないために DBRE ポジションとして僕がいるわけですが、今後はみんなにも SQL を意識してもらえるよう動いていくつもりです。

CakePHP、Laravelに関わらず、
開発者も SQL を常に意識して全体的な品質を上げていきたいですね。

参考
[Laravel・データベースからデータ取得する全実例](https://blog.capilano-fw.com/?p=665)




#4 先進性・自由度
この話題はフレームワーク比較においてかなりセンシティブな内容かもしれないですが、一個人の意見として書いていこうと思います。

先進性に関してはモダンな技術をいち早く取り入れている**Laravelに軍配が上がります**。
デフォルトで**Vue、Bootstrapが搭載されており、他にも開発環境、debugのためのオフィシャルパッケージも続々追加**されています。これだけでもLaravelを選択する理由になるほどLaravelの非常に魅力的な点です。
ちなみに、LancersとMentaを比較してもMentaではviewの一部にVueが積極的に採用されていたりと、より先進的に感じました。

自由度に関しては、Laravelは外部パッケージが多く必要に応じてさまざまな開発が行える柔軟性のあるフレームワークという印象でした。ディレクトリ構造も自由であるため、アーキテクチャもかなり自由に開発することができます。その反面、覚えることが多くなるため、開発速度の低下に繋がります。
CakePHP本体で基本的なことは大体こなせるという印象でした。また、良い意味で規約が多く他のCakePHPのプロジェクトにジョインしても構造はほとんど同じであるため、高速開発に向いています。

- 高速で大人数での規約がっちり開発はCakePHP
- 自由かつ柔軟な少人数の開発はLaravel

::: note
社内での意見
CakePHP
縛りの多いフレームワークで、規約を覚えるのが大変だが、一度覚えてしまえば開発者の力量に左右されず、安定した品質のコードになる

Laravel
DIのサポートが手厚いのでservicesとかを置きやすくて、設計を拡張しやすくて自由度が高い
ある程度の選択肢を開発者に委ねているため、開発者の設計能力や各開発者が暴走しないように統率するマネジメント能力の腕が試される

意見
進化するにつれ縛りが増えていったのは、開発規模が大きくなり多人数で開発することが多くなったことに伴い、言語自体に縛りを入れていった歴史がある。しかし、近年では昨今揺り戻しがおきていて、だんだんと縛りが緩くなってきたのかな？と思うこともある

最近では、適当にググるとLaravel以外選択肢がないというような勢いの記事がたくさんヒットするので誤解しがちだが、CakePHPやSymphonyにも根強い利用者はいる。結局のところ、フレームワークも道具なので、場合に応じて使い分けが大切。

:::


# 終わりに
初心者視点のCakePHPとLaravelの比較、いかがだったでしょうか。
今回の記事の内容は、二つのフレームワークの違いでもあり、CakePHPからLaravelの開発に移った時に早く知っておけばよかったと思ったものでもあります。

最後にもう一度、冒頭でも書いた通り、フレームワークは時代に合わせて必要に応じて作られて現在に至るまで利用され続けており、優劣はなく、それぞれ強み・良さのあるものです。
ぜひ、皆さんのフレームワークの魅力を理解するきっかけになればと思います。

また、この記事を書くにあたってご意見を下さった皆さんに本当に感謝しています！

誤った点、補足すべき点等ありましたら教えていただけると嬉しいです。
ランサーズ Advent Calendar 2021の25日目、最後を飾りますのは曽根さん（@sonetty）です。非常に楽しみです！！