ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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 の基本
<?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 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 アプリ内で同居は非推奨。マイクロサービス境界で分けるなら可。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?