2.

CakePHP (PHP フレームワーク) 完全ガイド(歴史・最新 5.x・Bake CLI)

編集
この記事の要点
  • CakePHP: 2005 年リリースの老舗 PHP フルスタックフレームワーク。Ruby on Rails に強い影響
  • 命名規則重視(Convention over Configuration): Users モデル → users テーブル → UsersController
  • Bake CLI: bin/cake bake all Users で MVC + マイグレーション一括生成
  • 最新 CakePHP 5.x(2023〜)。PHP 8.1+ 必須、Composer 配布、PSR-7/PSR-15 準拠
  • 日本でのシェアは Laravel に押されたが、アップグレードガイドが手厚く長期運用には強い

CakePHP とは

CakePHP は 2005 年に Michal Tatarynowicz によって開発された PHP のフルスタック Web フレームワークです。Ruby on Rails の思想を PHP に持ち込んだ先駆者で、「規約は設定に勝る (Convention over Configuration)」を貫いています。

歴史とリリース

バージョンリリース主な特徴
1.x2006初版。PHP 4 系対応
2.x2011PHP 5 対応。日本で最も普及したバージョン
3.x2014名前空間・Composer 対応・新 ORM(Hash 配列から Entity 中心へ)
4.x2019PHP 7.2+、型宣言の本格採用
5.x2023PHP 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
コントローラUsersControllerURL /users
アクションUsersController::view($id)URL /users/view/1
テンプレートtemplates/Users/view.php
リレーション$user->postsposts.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 の基本

<?php
// src/Controller/UsersController.php
namespace App\Controller;

use Cake\Controller\Controller;

class UsersController extends Controller
{
    public function index()
    {
        $this->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)

<!-- templates/Users/index.php -->
<h1>ユーザー一覧</h1>

<?= $this->Form->create($user) ?>
  <?= $this->Form->control('name') ?>
  <?= $this->Form->control('email') ?>
  <?= $this->Form->submit('保存') ?>
<?= $this->Form->end() ?>

<table>
  <?php foreach ($users as $user): ?>
    <tr>
      <td><?= h($user->id) ?></td>
      <td><?= $this->Html->link($user->name, ['action' => 'view', $user->id]) ?></td>
      <td><?= h($user->email) ?></td>
      <td><?= $user->created->format('Y-m-d') ?></td>
    </tr>
  <?php endforeach; ?>
</table>

<?= $this->Paginator->numbers() ?>

テンプレートエンジンは標準では純粋な PHP ですが、Twig 連携(cakephp/twig-view プラグイン)も可能です。

CakePHP vs Laravel vs Symfony

項目CakePHP 5Laravel 11Symfony 7
初リリース200520112005
思想Convention 重視Convention + 表現力Configuration 重視・疎結合
スキャフォールドBake(最強)artisan make:*MakerBundle
ORM独自 ORM(Table/Entity)EloquentDoctrine
テンプレート素 PHP / TwigBladeTwig
日本でのシェア中(減少)最大小〜中(企業向け)
学習コスト

強みと弱み

強み

  • 規約に従えば設定ファイルがほぼ要らない → 小〜中規模で速い立ち上げ
  • 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 アプリ内で同居は非推奨。マイクロサービス境界で分けるなら可。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Laravel
  2. CakePHP
  3. Symfony
  4. Zend Framework (PHP フレームワーク)
  5. DietCake
  6. phalcon
  7. CodeIgniter
  8. FuelPHP
  9. Slim
  10. Flight
  11. Yii
  12. Silex

最近更新/作成されたページ