タイトル: CakePHP
SEOタイトル: CakePHP (PHP フレームワーク) 完全ガイド(歴史・最新 5.x・Bake CLI)
| この記事の要点 |
|
CakePHP とは
CakePHP は 2005 年に Michal Tatarynowicz によって開発された PHP のフルスタック Web フレームワークです。Ruby on Rails の思想を PHP に持ち込んだ先駆者で、「規約は設定に勝る (Convention over Configuration)」を貫いています。
歴史とリリース
| バージョン | リリース | 主な特徴 |
|---|---|---|
| 1.x | 2006 | 初版。PHP 4 系対応 |
| 2.x | 2011 | PHP 5 対応。日本で最も普及したバージョン |
| 3.x | 2014 | 名前空間・Composer 対応・新 ORM(Hash 配列から Entity 中心へ) |
| 4.x | 2019 | PHP 7.2+、型宣言の本格採用 |
| 5.x | 2023 | PHP 8.1+、Enum / Readonly / FirstClassCallable 活用 |
インストール
# Composer で新規プロジェクト
composer create-project --prefer-dist cakephp/app:~5.0 myapp
cd myapp
# 開発サーバ起動
bin/cake server -H 0.0.0.0 -p 8765
# ブラウザで http://localhost:8765 → ようこそ画面
ディレクトリ構造
myapp/
├── bin/cake # CLI (Bake / Migrations 等)
├── config/ # 設定ファイル
│ ├── app.php
│ ├── routes.php
│ └── bootstrap.php
├── src/
│ ├── Controller/ # コントローラ
│ ├── Model/
│ │ ├── Table/ # ORM Table クラス
│ │ └── Entity/ # ORM Entity クラス
│ ├── View/ # ビューヘルパー等
│ └── Application.php
├── templates/ # *.php ビューテンプレート
├── webroot/ # ドキュメントルート
│ ├── index.php
│ ├── css/
│ └── js/
├── tests/ # PHPUnit テスト
├── tmp/ # キャッシュ・セッション
├── logs/
└── composer.json
命名規則(Convention)
| 種別 | クラス名 | テーブル / URL |
|---|---|---|
| テーブル | UsersTable | テーブル users |
| エンティティ | User | — |
| コントローラ | UsersController | URL /users |
| アクション | UsersController::view($id) | URL /users/view/1 |
| テンプレート | templates/Users/view.php | — |
| リレーション | $user->posts | posts.user_id FK |
Bake CLI: 一括スキャフォールド
# DB 接続設定: config/app_local.php に DB 情報を書く
# テーブル定義から Model + Controller + Template を一括生成
bin/cake bake all Users
# 部分生成
bin/cake bake controller Users
bin/cake bake model Users
bin/cake bake template Users
# マイグレーション
bin/cake bake migration CreateUsers name:string email:string created modified
bin/cake migrations migrate
bin/cake migrations rollback
# シーダ
bin/cake bake seed Users
bin/cake migrations seed --seed UsersSeed
コントローラ + ORM の基本
paginate = ['limit' => 20, 'order' => ['Users.id' => 'DESC']];
$users = $this->paginate($this->Users);
$this->set(compact('users'));
}
public function view(string $id)
{
$user = $this->Users->get($id, contain: ['Posts']);
$this->set(compact('user'));
}
public function add()
{
$user = $this->Users->newEmptyEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->getData());
if ($this->Users->save($user)) {
$this->Flash->success('保存しました');
return $this->redirect(['action' => 'index']);
}
$this->Flash->error('保存できませんでした');
}
$this->set(compact('user'));
}
}
ORM(Table / Entity / Query Builder)
// 取得
$users = $this->Users->find()
->where(['active' => true])
->order(['created' => 'DESC'])
->limit(10)
->all();
// JOIN
$posts = $this->Posts->find()
->contain(['Users', 'Tags'])
->where(['Users.email LIKE' => '%@example.com'])
->all();
// 1 件取得
$user = $this->Users->get(1);
$user = $this->Users->findByEmail('foo@example.com')->first();
// 保存
$user = $this->Users->newEntity(['name' => 'Tanaka', 'email' => 't@example.com']);
$this->Users->save($user);
// バルク更新
$this->Users->updateAll(['active' => false], ['last_login <' => '2025-01-01']);
// トランザクション
$conn = $this->Users->getConnection();
$conn->transactional(function () use ($user, $post) {
$this->Users->saveOrFail($user);
$this->Posts->saveOrFail($post);
});
テンプレート(View)
ユーザー一覧
= $this->Form->create($user) ?>
= $this->Form->control('name') ?>
= $this->Form->control('email') ?>
= $this->Form->submit('保存') ?>
= $this->Form->end() ?>
= h($user->id) ?>
= $this->Html->link($user->name, ['action' => 'view', $user->id]) ?>
= h($user->email) ?>
= $user->created->format('Y-m-d') ?>
= $this->Paginator->numbers() ?>
テンプレートエンジンは標準では純粋な PHP ですが、Twig 連携(cakephp/twig-view プラグイン)も可能です。
CakePHP vs Laravel vs Symfony
| 項目 | CakePHP 5 | Laravel 11 | Symfony 7 |
|---|---|---|---|
| 初リリース | 2005 | 2011 | 2005 |
| 思想 | Convention 重視 | Convention + 表現力 | Configuration 重視・疎結合 |
| スキャフォールド | Bake(最強) | artisan make:* | MakerBundle |
| ORM | 独自 ORM(Table/Entity) | Eloquent | Doctrine |
| テンプレート | 素 PHP / Twig | Blade | Twig |
| 日本でのシェア | 中(減少) | 最大 | 小〜中(企業向け) |
| 学習コスト | 低 | 中 | 高 |
強みと弱み
強み
- 規約に従えば設定ファイルがほぼ要らない → 小〜中規模で速い立ち上げ
- Bake が強力: DB から CRUD 画面まで瞬時に生成
- 後方互換性とアップグレードガイドが手厚い → 既存システムの長期運用に強い
- 古くからある分、日本語書籍と勉強会の蓄積が豊富(CakeFest Tokyo 等)
- 軽量で動作が速い(特に CakePHP 3 以降は再設計済)
弱み
- Laravel に比べてエコシステム(パッケージ・教材)が薄い
- 規約から外れた設計をすると逆に書きにくい
- 2.x / 3.x で書かれた既存システムの5.x 移行コストが大きい
- 採用案件が減っており、求人市場では Laravel の方が有利
移行 / アップグレード
# 3.x → 4.x: Upgrade ツールを使う
composer require --dev cakephp/upgrade
bin/cake upgrade file_rename templates
bin/cake upgrade rector --rules cakephp40
# 4.x → 5.x も同様
bin/cake upgrade rector --rules cakephp50
# 参考: CakePHP Cookbook の Migration Guide が手厚い
# https://book.cakephp.org/5/en/appendices/4-x-migration-guide.html
学習リソース
- 公式ドキュメント (CakePHP Cookbook):
book.cakephp.orgに英語・日本語版あり - 公式 API リファレンス:
api.cakephp.org - CakeFest(年次カンファレンス)/ CakePHP Tokyo Meetup
- 書籍: 「CakePHP 4 で学ぶ実践 Web 開発」など
- サンプル: GitHub の
friendsofcake/awesome-cakephp
FAQ
Q: 新規プロジェクトで CakePHP を選ぶべき?
A: 規約に沿うシンプルな業務系・管理画面ならアリ。それ以外は Laravel が無難。既存 CakePHP 案件を引き継ぐなら CakePHP 一択。
Q: CakePHP 2.x がまだ動いているがアップグレードすべき?
A: 2.x は 2020 年に EOL。セキュリティ的にも 4.x / 5.x への移行を推奨。公式の Upgrade ツールと Rector が用意されている。
Q: Laravel と CakePHP は併用できる?
A: 同じ PHP アプリ内で同居は非推奨。マイクロサービス境界で分けるなら可。