Laravel/CakePHP3比較〜両刀使いしてみてわかったこと〜

波多野雅哉
paronym
Published in
9 min readDec 6, 2019

この記事はPARONYM Advent Calendar 2019の6日目の記事です。

こんにちは!パロニムのサーバーサイドエンジニアの波多野です。
最近はエンジニア以外もいろいろやってますが、本業はサーバーサイドエンジニアです。

タイトルの通りパロニムのサーバーサイドでは現在PHP7系をメインで使っており、CakaPHP3とLaravelのシステムが混在しております。

具体的にはCMSはCakePHP3、自前で作成した社内の案件管理システムはLaravel6で作成し、その他にもLaravelは小規模ながら使用されております。

自分的にはLaravel推しだったのですが、CakePHP3と同時に使ってみるといろいろと良し悪しがあると感じてきましたので触りだけまとめてみようと思います。

これからPHPを使ったシステムを作る際のフレームワーク選定に少しでも参考になれたら嬉しいです!

一言でまとめると・・・

いきなりハードルがあがりますが、調べてもはっきりとした差が明記されている記事が見当たらなかったのでここで自分なりに解釈していることを書いてみます笑

Laravel: 便利で賢く最新技術や流行との親和性が高い
CakePHP: 規約ベースで爆速開発だけど基本はシンプルなWEB開発

Laravelは自由がかなり効きます。規約というか良しなにやってくれるようにするにはあくまでも設定ベースです。
それとフレームワークとして便利なライブラリやメソッドがたくさんあるので同じファイルアップロードとかにしても実装の仕方も様々にできます。

一方CakePHPは非常に規約にうるさいです。規約からはみ出ることをやろうとすると柔軟に対応できなかったりするので、王道なwebアプリならまだしも、少しトリッキーなことをするのには自由が効かない場合がありますが、その分人が入れ替わったり、横展開することに強かったりもします。

一部比較してみましょう

まずはWEB開発には必須のAPI

Laravel

routesを定義して後はcontrollerでreturnするだけでjsonが返ります。
なんて便利!!

routes/api.php

Route::resouce('users', 'UsersController');

app/Http/Controllers/Api/UsersController.php

public function index()
{
return response(Users::all());
}

CakePHP3

routes.phpの中で受け取りたいフォーマットとRESTFullなルートを自動生成してくれるresouceルートとを指定します。
controllerではsetするだけ。
こちらも爆速だが若干Laravelの方が簡単な印象。

config/routes.php

Router::scope('/', function ($routes) {
$routes->setExtensions(['json']);
$routes->resources('Users');
});

src/Controller/Api/UsersController.php

public function index()
{
$users = $this->Users->find('all');
$this->set([
'users' => $users,
'_serialize' => ['users']
]);
}

次にみんなを苦しませる(?)クエリビルダ

Laravel

cakeに比べて直感的に気がします。
カンマで区切っていけばできちゃいます。
あれ、この書き方できたっけな?みたいなものも大体大丈夫なので引数が配列だっけ?カンマ区切りだっけ?とかに悩まされずに済みます。
また、ここでは触れませんが使い勝手が良いEloquentていうデータ操作モデルもあります。

$query = DB::table('Users')
->select(['id', 'name'])
->where('id', '!=', 1)
->orderBy('created', 'DESC');

foreach ($query as $user) {
debug($user->id);
debug($user->name);
}

CakePHP3

Tableオブジェクトを取得して、クエリビルダを組み立てていきます。
もちろん組み立て次第で、Eager ローディング、Lazy ローディングにも対応できます。

$users = TableRegistory::get('Users');$query = $users
->find()
->select(['id', 'name'])
->where(['id !=' => 1])
->order(['created' => 'DESC']);

foreach ($query as $user) {
debug($user->id);
debug($user->name);
}

地味にここに工数が取られる。。。フロントまわり

Laravel

テンプレートエンジンとしてBladeが入っています。
それとVue.js、Bootstrapの標準装備、そしてWebpackをラップしたLaravel.mixもあったりして至れりつくせりでフロントエンド開発に力を入れる流行に即しています。モダンですね。

{-- 変数出力--}
<h1>Laravel</h1>
Hello, @{{ name }}.
{-- if --}
@if (count($records) === 1)
1レコードある!
@elseif (count($records) > 1)
複数レコードある!
@else
レコードがない!
@endif
{-- foreach --}
@foreach ($users as $user)
<p>これは {{ $user->id }} ユーザーです。</p>
@endforeach

CakePHP3

テンプレートエンジンがないので自力ですね
htmlspecialcharsをh()で入れなければいけないので忘れると脆弱性になりますね。Laravelでは{{ }}で変数出力すればhtmlspecialcharsは自動でかかります。
他にもLaravelに不足しているhelperは意外と便利で揃っているので気になる人は調べてみてください。

<-- 変数出力 -->
<h1>CakePHP3</h1>
Hello, <?= h($name) ?>.
<-- if -->
<?php if ($username === 'sally'): ?>
<h3>やあ、Sally</h3>
<?php elseif ($username === 'joe'): ?>
<h3>やあ、Joe</h3>
<?php else: ?>
<h3>やあ、知らない人</h3>
<?php endif; ?>
<-- foreach -->
<ul>
<?php foreach ($todo as $item): ?>
<li><?= $item ?></li>
<?php endforeach; ?>
</ul>

Amazon S3へのファイルアップロード

Laravel

Flysystemパッケージを介して操作が可能です。
これが半端なく便利。
config/filesystem.phpにストレージの設定を記載すれば抽象化されて同じインターフェースで使用可能です。

/**
/* controller
/* config/filesystems.phpへの設定が必要だが、割愛
**/
public function create(Request $request)
{
$post = new Post;
$form = $request->all();

//s3アップロード開始
$image = $request->file('image');
// バケットの`prefix`フォルダへアップロード
$path = Storage::disk('s3')->putFile('prefix', $image, 'public');
// アップロードした画像のフルパスを取得
$post->image_path = Storage::disk('s3')->url($path);

$post->save();

return redirect('posts/create');
}

CakePHP3

残念ながら便利なライブラリはないので純PHPで実装です。。。

最後に主観

Laravel

他にもEloquentってデータ操作の、かなり使えるヤツがいたり。
便利なバリデーション機構、自由なディレクトリ構成、WEBアプリならある王道な機構は設定と便利なライブラリで実装するだけ(しかもかなり直感的)の優等生ぶりは半端ないです。
流行にも敏感なのでフロントエンドドリブンな開発ならLaravelをオススメします。
逆に便利なライブラリ群や設定周りが多いので、学習コストはまぁまぁ必要かなぁ。

CakePHP3

規約が多いのでそこさえ抑えてしまえばおおよそ実装できちゃいます。
イコール実装の選択肢が少ないところは考える手間がなくて楽。
でもCakeに隠蔽されたブラックボックスが非常に多いので、ハマると大変です。
また、フレームワークに任せてある部分の挙動はドキュメントの読み込みが結構必要です。
Laravelと比べるとフロントエンドやシステム間連携を必要とする実装に弱い印象なので、凝ったことをやらない王道なWEB開発にこそ力を発揮するフレームワークなのかなーと思います。
CakePHP4も気になるー。隙を見つけてバージョンアップしたいのは内緒。

コードよりも文字が多くなってしまいましたが。。。

ここらへんまでにします!
次回機会があれば更に深掘りしようかと思います!

PARONYM tech blogを今後ともよろしくお願いいたします!

--

--