ServBayでCakePHPプロジェクトを作成・実行する
ServBayはmacOS専用に設計されたローカルWeb開発環境です。PHP、Node.js、Python、Go、Javaなどのマルチ言語ランタイムや、MySQL・PostgreSQL・MongoDB・Redisなどのデータベースサービスを統合し、CaddyまたはNginx Webサーバーを搭載しています。開発者が手軽にローカル環境でプロジェクトを構築・管理できる効率的なプラットフォームです。
この記事では、ServBay環境でCakePHPプロジェクトを新規作成し、設定し、動かす手順を詳しく解説します。CakePHPはMVC(モデル・ビュー・コントローラ)パターンを採用した人気のPHP Webフレームワークで、迅速な開発、高機能ORM、堅牢なセキュリティ機能を持つことで知られています。ServBayの利便性と組み合わせることで、CakePHP開発をすぐにスタートできます。
CakePHPとは?
CakePHPは、オープンソースのPHP Webアプリケーション開発フレームワークです。柔軟性を損なうことなく、迅速かつ構造的にWebアプリケーションを構築するための基盤を提供します。「設定より規約(Convention over Configuration)」の原則を採用し、よくある開発作業を大幅に簡略化できます。
CakePHPの主な特徴・メリット
- MVCアーキテクチャ: コードの整理が明確で、保守・拡張が容易。
- 高速開発: コード自動生成ツール(BakeCLI)により開発が加速。
- 強力なORM(オブジェクト関係マッパー): データベース操作をシンプルにし、多様なDBシステムに対応。
- 組み込みのセキュリティ: CSRF対策、SQLインジェクション防止、入力検証などセキュリティ機能を標準搭載。
- 柔軟なテンプレートエンジン: 多様なビュー技術をサポート。
- 活発なコミュニティと豊富なプラグイン: 問題が解決しやすく、機能の拡張が容易。
- 充実したドキュメント: 実践的なガイドとAPIリファレンスを完備。
CakePHPは、シンプルなAPIから本格的なエンタープライズシステムまで、様々な規模のWebアプリ開発に適しています。
ServBayでCakePHP開発環境を構築する
ServBayはCakePHP開発に下記のような最適な統合環境を提供します:
- PHP実行環境&主要拡張モジュールがプリインストール済み
- Composerパッケージマネージャーを同梱
- 設定が容易なWebサーバー(Caddy/Nginx)
- MySQL・PostgreSQL・Redis等のDBサービスを統合
これにより、個別のコンポーネントインストールや複雑な設定は不要です。
前提条件
作業を始める前に、次の準備を確認してください:
- ServBayのインストール: macOSにServBayをダウンロードしてインストール済みであること。
- ServBayサービスの起動: ServBayアプリを起動し、必要なパッケージ(PHP、使用予定のDB(MySQLまたはPostgreSQL)、RedisやMemcachedなどのキャッシュサービス)が稼働していること。「ソフトウェア」タブで管理できます。
- ServBayの基本操作に慣れている: サイト追加や構成変更が分かること。未習得の場合はServBay基本ガイドを先にお読みください。
CakePHPプロジェクトを新規作成する
ServBayでは、Webプロジェクトのファイルを /Applications/ServBay/www
ディレクトリ下にまとめて配置することを推奨しています。この構成だと、ServBayがサイトを自動認識しやすくなります。
ターミナルを開く
macOSのターミナルアプリを起動します。
ServBayサイトルートに移動
ServBay推奨のディレクトリに移動します:
bashcd /Applications/ServBay/www
1プロジェクト用ディレクトリを作成
CakePHP用の新しいサブディレクトリを作成します。ここでは
servbay-cakephp-app
という名前を例とします:bashmkdir servbay-cakephp-app cd servbay-cakephp-app
1
2ComposerでCakePHPプロジェクトを作成
ServBayにはComposerがプリインストールされています。下記コマンドでCakePHPアプリのスケルトンを作成します:
bashcomposer create-project --prefer-dist cakephp/app .
1このコマンドで最新の安定版CakePHPと必要な依存パッケージ一式が現在のディレクトリ (
.
)にインストールされます。ORMドライバの追加(PostgreSQL使用時)
PostgreSQL利用時は、専用ORMドライバも追加インストールします:
bashcomposer require cakephp/orm-pgsql
1MySQL利用時は通常追加不要。必要ドライバはCakePHPコアに含まれています。
初期設定
プロジェクト作成後、特にデータベース接続など基本設定を行います。
環境変数・DB接続の設定
CakePHPのローカル設定は
config/app_local.php
に集中しています。この中のDatasources
セクションでDB接続情報を記載します。ServBay標準のDBユーザー名はroot
、パスワードはpassword
です。例えばMySQL設定例:
php// config/app_local.php 'Datasources' => [ 'default' => [ 'className' => \Cake\Database\Connection::class, 'driver' => \Cake\Database\Driver\Mysql::class, // PostgreSQLを使う場合は\Cake\Database\Driver\Postgres::class 'persistent' => false, 'host' => '127.0.0.1', // ServBay標準はローカル //'port' => '3306', // MySQLは3306が標準、PostgreSQLは5432 'username' => 'root', // ServBay標準ユーザー名 'password' => 'password', // ServBay標準パスワード 'database' => 'servbay_cakephp_app', // 利用予定のデータベース名 'encoding' => 'utf8mb4', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => false, /** * テーブル名に"user"のような予約語を使う場合、識別子クオートをtrueにしてください。 * 普通の単語("cake"等)の場合はfalseでOKです。不明な場合はtrue推奨。 */ 'quoteIdentifiers' => false, /** * 現時点の制限事項: * - 多くのドライバはPDOのオプションによるアイソレーションレベル設定非対応 * 設定してもエラーになります。 * - 文字コードの指定も一部ドライバで非対応。 * - CakePHPのパッケージドライバ(例:Postgres)はPDOオプション未対応。 * Postgresはencodingのみ設定できます。 */ 'options' => [], //'url' => env('DATABASE_URL', null), // DATABASE_URLを使う場合はこの行を有効化 ], ],
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36使用DB種別(MySQL/PostgreSQL)に応じて
driver
やport
を調整し、database
名も実際に作成予定のものに合わせてください。
Webサーバーの設定(ServBayでサイトを作成)
ブラウザからCakePHPプロジェクトにアクセスするには、ServBayでサイトを新規追加し、プロジェクトディレクトリと紐づける必要があります。
ServBay コントロールパネルを開く
ServBayアイコンをクリックしてコントロールパネルを表示します。
「サイト」タブに移動
コントロールパネル左側メニューで「サイト」(旧称「ホスト」)を選択。
新規サイトを追加
右下の
+
ボタンで新規サイトを追加し、次の情報を入力します:- 名前 (Name): 例:
My CakePHP Dev Site
など判別しやすい名前 - ドメイン (Domain): 例:
servbay-cakephp-test.local
のような開発用ローカルドメイン(ServBayが自動で127.0.0.1へ割り当て) - サイトタイプ:
PHP
を選択 - PHPバージョン: ご利用CakePHPバージョンに準拠したPHP(CakePHP 4+ はPHP 7.4+、CakePHP 5+はPHP 8.1+、例:
8.3
) - ドキュメントルート: 重要! CakePHPのWebドキュメントルートはプロジェクトルートでなく、プロジェクト内
webroot
ディレクトリです。例:/Applications/ServBay/www/servbay-cakephp-app/webroot
(servbay-cakephp-app
は任意のディレクトリ名に置換)
- 名前 (Name): 例:
保存と反映
入力後、右下の「保存」ボタンで設定を完了します。変更反映の確認が出た場合は「はい」をクリック。ServBayがCaddyまたはNginxの設定を自動適用し、
servbay-cakephp-test.local
ドメインへのリクエストをwebroot
ディレクトリへルーティングします。
詳しい手順はServBay公式ドキュメント:最初のサイトを追加する をご覧ください。
基本設定の確認
これでブラウザから作成したサイトへのアクセスが可能になっているはずです。
ブラウザを開いて、ServBayで設定したドメイン(例:https://servbay-cakephp-test.local
)へアクセスします。
画面にCakePHPデフォルトのウェルカムページが表示されれば、PHP環境・Webサーバー・ServBayの構成すべてが正常に動作しています。
データベースおよびキャッシュサービスの統合
CakePHPの強力なORM・キャッシュ機能を使い、ServBayで用意されているDBやキャッシュサービスと連携させましょう。
リレーショナルデータベース例(MySQL / PostgreSQL)
CakePHPのORMでServBay内MySQLまたはPostgreSQLへ接続し、users
テーブル作成/基本操作(CRUD手順)を例示します。
ServBayでデータベースを作成
データベースマイグレーションを行う前に、ServBayのDBサービスで新しいDBを用意します。phpMyAdmin(MySQL/MariaDB用)、pgAdmin(PostgreSQL用)、NavicatやDBeaverなどのツールを使い、
127.0.0.1
、ユーザーroot
・パスワードpassword
で接続し、servbay_cakephp_app
というDBを新規作成してください。ORMモデルファイルの作成
CakePHPのORMでは、各DBテーブルに対応するModelファイルが必要です。
UsersTable.php
でusers
テーブルを表します。src/Model/Table/UsersTable.php
に以下の内容を書き込みます:php<?php namespace App\Model\Table; use Cake\ORM\Table; use Cake\Validation\Validator; // バリデーションルール用 class UsersTable extends Table { /** * Initialize method * * @param array $config The configuration for the Table. * @return void */ public function initialize(array $config): void { parent::initialize($config); $this->setTable('users'); // テーブル名を明示 $this->setDisplayField('name'); // 関連等で表示するカラム $this->setPrimaryKey('id'); // 主キー // タイムスタンプ用ビヘイビア // $this->addBehavior('Timestamp'); } /** * バリデーションルール(例) * * @param \Cake\Validation\Validator $validator Validator instance. * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator): Validator { $validator ->scalar('name') ->maxLength('name', 255) ->requirePresence('name', 'create') ->notEmptyString('name'); $validator ->email('email') ->requirePresence('email', 'create') ->notEmptyString('email') ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); // emailの一意性 return $validator; } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49Bakeでマイグレーション作成
CakePHP標準のマイグレーション機能でDB構造を管理します。プロジェクトルート(
/Applications/ServBay/www/servbay-cakephp-app
)で下記のように:bashbin/cake bake migration CreateUsers name:string email:string:unique
1これにより、
users
テーブルの作成・name
(文字列)・email
(一意制約付き文字列)カラム定義が自動生成されます。マイグレーション実行
マイグレーションコマンドで実際にDBに
users
テーブルを作成します:bashbin/cake migrations migrate
1成功すると、用意したDBに新しい
users
テーブルが生成されます。DB接続設定の再確認(未設定時)
config/app_local.php
のDatasources.default
設定がご利用DB・認証情報と一致しているか再度確認してください。MySQL例:
php'Datasources' => [ 'default' => [ 'className' => \Cake\Database\Connection::class, 'driver' => \Cake\Database\Driver\Mysql::class, 'host' => '127.0.0.1', 'username' => 'root', 'password' => 'password', 'database' => 'servbay_cakephp_app', // ... その他 ], ],
1
2
3
4
5
6
7
8
9
10
11PostgreSQL例:
php'Datasources' => [ 'default' => [ 'className' => \Cake\Database\Connection::class, 'driver' => \Cake\Database\Driver\Postgres::class, 'host' => '127.0.0.1', // 'port' => '5432', 'username' => 'root', // ServBay標準 'password' => 'password', // ServBay標準 'database' => 'servbay_cakephp_app', // ... その他 ], ],
1
2
3
4
5
6
7
8
9
10
11
12
サンプル用ルーティング&コントローラーメソッドの追加
config/routes.php
でユーザー追加・表示用のルートを追加します:php// config/routes.php use Cake\Routing\RouteBuilder; use Cake\Routing\Router; use Cake\Routing\Route\DashedRoute; Router::defaultRouteClass(DashedRoute::class); Router::scope('/', function (RouteBuilder $routes) { // ... その他ルート $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']); // DBデモ用ルーティング $routes->connect('/db-add-user', ['controller' => 'Pages', 'action' => 'dbAddUser']); $routes->connect('/db-list-users', ['controller' => 'Pages', 'action' => 'dbListUsers']); // ... その他ルート $routes->fallbacks(DashedRoute::class); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18src/Controller/PagesController.php
でDB操作用メソッドを追加します:php<?php namespace App\Controller; use Cake\Http\Response; use Cake\ORM\TableRegistry; use Cake\Datasource\Exception\RecordNotFoundException; // レコード未存在時例外 class PagesController extends AppController { /** * デフォルトビュー表示 * * @param array ...$path Path segments. * @return \Cake\Http\Response|null */ public function display(...$path): ?Response { // ... デフォルト表示 return new Response(['body' => 'Hello ServBay! This is the default page.']); } /** * DBサンプル:ユーザー追加 */ public function dbAddUser(): Response { $usersTable = TableRegistry::getTableLocator()->get('Users'); // Users Tableインスタンス取得 // 新規ユーザーエンティティ $user = $usersTable->newEntity([ 'name' => 'ServBay Demo User', 'email' => '[email protected]' // ServBayらしい例示 ]); // DBへ保存 if ($usersTable->save($user)) { return new Response(['body' => 'User added successfully! User ID: ' . $user->id]); } else { // バリデーション等による保存失敗時 $errors = $user->getErrors(); // 検証エラー取得 return new Response(['body' => 'Failed to add user. Errors: ' . json_encode($errors)]); } } /** * DBサンプル:全ユーザー一覧 */ public function dbListUsers(): Response { $usersTable = TableRegistry::getTableLocator()->get('Users'); // 全ユーザー取得 $users = $usersTable->find()->all(); // 結果をJSONで出力 return new Response(['body' => json_encode($users->toArray())]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58DB接続デモページにアクセス
https://servbay-cakephp-test.local/db-add-user
へアクセスしユーザーを登録。成功メッセージが表示されます。https://servbay-cakephp-test.local/db-list-users
でDB内ユーザー一覧を取得(先ほど追加したユーザーも含まれるはずです)。
これらの操作でCakePHPプロジェクトがServBayのRDBと接続し、ORMによる基本操作ができることを確認できます。
キャッシュサービス例(Memcached / Redis)
CakePHP標準のキャッシュAPIは、MemcachedやRedisなど異なるキャッシュエンジンを柔軟に切り替えて利用できます。ServBayにはPHP用Memcached・Redis拡張およびサービス自体がプリインストールされています。
まずServBay「ソフトウェア」タブでMemcachedまたはRedisサービスが稼働していることを確認してください。
キャッシュ接続の設定
config/app_local.php
のCache
セクションでキャッシュ接続パラメータを記載します。Memcached設定例:
php// config/app_local.php 'Cache' => [ 'default' => [ 'className' => \Cake\Cache\Engine\MemcachedEngine::class, 'servers' => ['127.0.0.1:11211'], // ServBay標準Memcached設定 'prefix' => 'servbay_cakephp_', // キャッシュキーのプリフィックス ], // ... その他キャッシュ設定 ],
1
2
3
4
5
6
7
8
9Redis設定例:
php// config/app_local.php 'Cache' => [ 'default' => [ 'className' => \Cake\Cache\Engine\RedisEngine::class, 'host' => '127.0.0.1', // ServBay標準Redisアドレス 'port' => 6379, // 標準Redisポート 'password' => null, // パスワードを設定している場合記入 'database' => 0, // RedisのDB番号 'prefix' => 'servbay_cakephp_', // キャッシュキーのプリフィックス ], // ... その他キャッシュ設定 ],
1
2
3
4
5
6
7
8
9
10
11
12
どちらを採用するか用途に応じて設定してください。
サンプル用ルートおよびコントローラーメソッドの追加
config/routes.php
でキャッシュテスト用ルート追加:php// config/routes.php // ... その他ルート $routes->connect('/cache-memcached', ['controller' => 'Pages', 'action' => 'cacheMemcached']); $routes->connect('/cache-redis', ['controller' => 'Pages', 'action' => 'cacheRedis']); // ... その他ルート
1
2
3
4
5src/Controller/PagesController.php
でキャッシュ利用メソッド追加:php<?php namespace App\Controller; use Cake\Http\Response; use Cake\Cache\Cache; // Cacheクラス導入 // ... その他use class PagesController extends AppController { // ... display, dbAddUser, dbListUsers等既存メソッド /** * キャッシュ例:Memcached */ public function cacheMemcached(): Response { // app_local.phpで'default'キャッシュがMemcachedEngine設定済みであること $cacheKey = 'servbay_memcached_test_key'; $cachedData = Cache::read($cacheKey); $responseBody = ''; if ($cachedData === false) { // キャッシュミス $responseBody = 'Cache miss! Writing "Hello Memcached!" to cache.'; $dataToCache = 'Hello Memcached!'; Cache::write($cacheKey, $dataToCache, 'default'); } else { // キャッシュヒット $responseBody = 'Cache hit! Data from cache: ' . $cachedData; } return new Response(['body' => $responseBody]); } /** * キャッシュ例:Redis */ public function cacheRedis(): Response { // app_local.phpで'default'キャッシュがRedisEngine設定済みであること $cacheKey = 'servbay_redis_test_key'; $cachedData = Cache::read($cacheKey); $responseBody = ''; if ($cachedData === false) { // キャッシュミス $responseBody = 'Cache miss! Writing "Hello Redis!" to cache.'; $dataToCache = 'Hello Redis!'; Cache::write($cacheKey, $dataToCache, 'default'); } else { // キャッシュヒット $responseBody = 'Cache hit! Data from cache: ' . $cachedData; } return new Response(['body' => $responseBody]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61キャッシュ動作デモ
- Memcached設定時:
https://servbay-cakephp-test.local/cache-memcached
にアクセス。初回は「Cache miss」表示、リロードで「Cache hit」表示。 - Redis設定時:
https://servbay-cakephp-test.local/cache-redis
にアクセス。同様の挙動。
- Memcached設定時:
これでCakePHPプロジェクトがServBayのキャッシュサービスと連携し正常動作していることを確認できます。
注意事項
- DBパスワード: ServBay標準のDBユーザー/パスワード(
root
/password
)はローカル開発専用です。本番利用時はより堅牢な認証情報に変更必須です。 - ドキュメントルート: ServBayサイト設定時は、必ず
webroot
ディレクトリをドキュメントルートに指定してください(プロジェクトルートは不可)。CakePHP標準の運用方法です。 - PHPバージョンの互換性: ServBayで選択するPHPバージョンとCakePHPの対応関係を必ず確認してください。公式ドキュメントも参照しましょう。
- ServBayのポート番号: 標準の80, 443ポートが占有されている場合、ServBay設定で別ポートに切り替え、「hosts」やURLでポート指定してアクセスしてください。
よくある質問(FAQ)
- Q:
servbay-cakephp-test.local
にアクセスできない・ページが見つからない?- A: ServBayサイト設定の「ドキュメントルート」が
.../servbay-cakephp-app/webroot
になっているか確認 - ServBayのWebサーバー(Caddy/Nginx)が稼働しているか
- OS側のhostsファイルで
servbay-cakephp-test.local
→127.0.0.1
のエントリがあるか(通常はServBayが自動構成) - CakePHPプロジェクトの
.htaccess
やサーバー設定ファイルが正しいか(デフォルトのwebroot/.htaccess
であれば問題なし)
- A: ServBayサイト設定の「ドキュメントルート」が
- Q: データベース接続に失敗する場合は?
- A: ServBayで該当DBサービス(MySQL/PostgreSQL)が起動しているか確認
config/app_local.php
の接続情報(host/port/username/password/database)が一致しているか- DB管理ツール等で実際に
servbay_cakephp_app
DBが作成済みかチェック
- Q: Composerや
bin/cake
コマンドが実行できない?- A: ターミナルのカレントディレクトリがプロジェクトルート(
/Applications/ServBay/www/servbay-cakephp-app
)か確認 - ServBayのPHPとComposerパッケージが稼働中であること
- パス上に
php
コマンドが通っているか(ServBay標準ではPATH追加されています)。うまくいかない場合はServBay組み込みのターミナルを利用、または手動でPATHを修正
- A: ターミナルのカレントディレクトリがプロジェクトルート(
まとめ
ServBayを使えば、macOS上でCakePHPプロジェクトのローカル開発環境を迅速・簡単に構築できます。PHP、Composer、WebサーバーやDB群をプリインストールし、複雑な設定手順を大幅に省力化。この記事では、プロジェクト作成から基本設定、Webサーバー紐づけ、DB/キャッシュ連携まで一気通貫の手順を詳解しました。ServBayの強みを最大限に活用し、環境セットアップに悩まず本来のアプリ開発に集中しましょう。