ServBay で Slim プロジェクトを作成・実行する方法
この記事では、強力なローカル Web 開発環境 ServBay を利用して、PHP ベースの Slim Framework プロジェクトをすばやく作成し、設定し、実行するための手順を詳しく紹介します。ServBayは、統合された PHP、Web サーバ(Caddy/Nginx/Apache)、各種データベースパッケージを備え、Slim 開発に理想的なプラットフォームです。
Slim とは?
Slim は軽量な PHP マイクロフレームワークで、シンプルかつ強力な Web アプリケーションや API を迅速に構築することを目的として設計されています。ルーティング、リクエスト・レスポンス処理のコア機能に特化し、短期間での開発やデプロイ、そしてより複雑なアプリの土台としても最適です。
Slim の主な特徴とメリット
- 軽量: Slim のコアは非常にコンパクトで、リソース消費が少なく、起動も高速。小規模~中規模アプリやマイクロサービス開発に最適です。
- 柔軟性: さまざまなサードパーティ製ライブラリ(テンプレートエンジン、ORM、認証ライブラリなど)を自在に組み合わせて利用できる設計で、プロジェクト要件に合わせたツール選択が可能です。
- 使いやすさ: シンプルな API と分かりやすいドキュメントにより、コア概念の習得と開発の開始が容易です。
- 強力なルーティング: 各種 HTTP メソッド(GET, POST, PUT, DELETE など)や、ルートグループ・ミドルウェア・パラメータキャプチャ等の複雑なルーティング設定をサポートします。
- ミドルウェア対応: リクエストやレスポンスに対して認証・ログ記録・CORS 対応など、アプリロジックの前後で柔軟に処理を追加できます。
Slim は、RESTful API の構築、プロトタイプ開発、特定機能の独立した実装などに最適な選択肢です。
ServBay で Slim プロジェクトを作成・実行する
このガイドでは、ServBay の事前設定された PHP 環境と ウェブサイト 機能を使い、Web サーバのセットアップから Slim サイトのブラウザ公開までを簡単な設定で行います。
事前準備
作業に入る前に、以下をご確認ください:
- ServBay のインストールと起動: ServBay が macOS または Windows にインストール済み・正常に起動していること。
- Composer が ServBay に組み込み済み: ServBay には Composer があらかじめ統合されており、別途インストール不要です。
Slim プロジェクトの作成
ServBay では、全サイトプロジェクトを以下のディレクトリ下にまとめて保管することを推奨しています。これによりプロジェクト管理や設定がしやすくなります。
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
ServBay サイトのルートディレクトリへ移動:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1プロジェクト用のディレクトリを作成:
bashmkdir servbay-slim-app
1作成したディレクトリへ移動:
bashcd servbay-slim-app
1Composer で Slim をインストール: プロジェクトディレクトリ内で Slim フレームワークと PSR-7 実装を導入します。
bashcomposer require slim/slim "^4.0" slim/psr7 -W
1このコマンドで、Slim 本体と
slim/psr7
ライブラリがvendor
ディレクトリに導入され、composer.json
・composer.lock
ファイルが生成されます。
Slim アプリケーションの初期化
- エントリファイルの作成: Slim では通常、リクエスト受付用に
public/index.php
のような単一の入口ファイルを設けます。プロジェクトルート下でpublic
ディレクトリを作り、index.php
を新規作成します。bashmkdir public touch public/index.php
1
2 - エントリファイル編集:
public/index.php
を開いて、以下の基本 Slim アプリコードを記述します。phpこのコードは、ルート URL (<?php // Composer のオートローダーを読み込み require __DIR__ . '/../vendor/autoload.php'; // 必要な PSR-7 インターフェースと Slim ファクトリクラスをインポート use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; // Slim アプリインスタンス作成 $app = AppFactory::create(); // GET リクエスト(ルート)用のルート追加 $app->get('/', function (Request $request, Response $response, $args) { // レスポンス本文に文字列を書き込む $response->getBody()->write("Hello ServBay!"); // レスポンスオブジェクトを返す return $response; }); // Slim アプリの実行 $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/
) の GET リクエストを受けて "Hello ServBay!" を返すだけの最小 Slim アプリを構築します。
ServBay ウェブサイトの設定
ブラウザから Slim プロジェクトへアクセスするため、ServBay で ウェブサイト(旧バージョンでは「ホスト」)の設定を行います。
- ServBay アプリの画面を開く。
- ウェブサイト (Websites) 機能に進む。
- 新規ウェブサイトの追加をクリック。
- プロジェクト情報を入力:
名前 (Name):
My First Slim Dev Site
(任意の名称でも OK)ドメイン (Domain):
servbay-slim-test.local
(ローカル開発には.local
や.test
推奨)ウェブサイト種別 (Website Type):
PHP
PHP バージョン (PHP Version): 希望する PHP バージョンを選択(例:
8.3
)ドキュメントルート (Document Root): ブラウズボタンから、プロジェクト
public
ディレクトリを選択- macOS:
/Applications/ServBay/www/servbay-slim-app/public
- Windows:
C:\ServBay\www\servbay-slim-app\public
Slim の入口ファイル
index.php
がpublic
配下にあるため、Web サーバはこのディレクトリをドキュメントルートとします。- macOS:
- サイト設定を保存。ServBay が Web サーバーの設定更新を自動で行い反映されます。
詳細な ServBay サイト構成手順については、最初のウェブサイト追加を参照してください。
Slim サイトへアクセス
設定完了後、Web ブラウザで設定したドメイン https://servbay-slim-test.local
にアクセスします。
正しく構築されていれば、ブラウザ画面に Hello ServBay!
と表示されます。これで、Slim プロジェクトが ServBay の Web サーバ上で動作していることが確認できます。
データベース統合例
Slim 自体にデータベース抽象層はありませんが、PHP の各種データベースライブラリとの統合は簡単に行えます。ここでは Laravel の Eloquent ORM(illuminate/database
)を利用し、MySQL と PostgreSQL への接続例、さらに Memcached と Redis の統合例も紹介します。
事前準備: データベース作成とマイグレーション
データベース統合の前に、ServBay で必要なデータベースを作成し、アプリ用テーブル構造も用意しましょう。
- データベース作成:
- ServBay アプリ画面で、利用するデータベース パッケージ(MySQL または PostgreSQL)に進む
- ServBay の管理ツール(MySQL/MariaDB は phpMyAdmin、PostgreSQL は pgAdmin など)またはコマンドラインで、新規データベースを作成(例:
servbay_slim_app
) - ServBay の root ユーザーの初期パスワードは
password
です。詳細は ServBay 画面で確認・変更可能
- Phinx (データベースマイグレーションツール)の導入と設定: データベース構造のバージョン管理には人気の Phinx を利用します。
- プロジェクトルート(例:
/Applications/ServBay/www/servbay-slim-app
やC:\ServBay\www\servbay-slim-app
)で Composer から Phinx を導入:bashcomposer require robmorgan/phinx
1 - Phinx 設定ファイルを初期化:bashプロジェクトルートに
vendor/bin/phinx init
1phinx.yml
が生成されるので、下記のように編集・設定します:yamlpaths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds' environments: default_migration_table: phinxlog default_environment: development # または任意名 development: # データベース種別に応じて構成 adapter: mysql # または pgsql host: 127.0.0.1 name: servbay_slim_app # 作成したデータベース名 user: root pass: password # データベースパスワード port: 3306 # MySQLデフォルト、PostgreSQLは5432 charset: utf8mb4 # MySQL推奨 collation: utf8mb4_unicode_ci # MySQL推奨 version_order: creation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- プロジェクトルート(例:
- マイグレーションファイルの作成: Phinx で新規マイグレーションファイルを生成します。bash
vendor/bin/phinx create CreateUsersTable
1db/migrations
下に新規 PHP ファイルが作成されます。下記のようにchange()
メソッドでusers
テーブル構造を記述します:php<?php declare(strict_types=1); use Phinx\Migration\AbstractMigration; final class CreateUsersTable extends AbstractMigration { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method * * Remember to call "create()" or "update()" and NOT "save()" when working * with the Table class. */ public function change(): void { $table = $this->table('users'); $table->addColumn('name', 'string') ->addColumn('email', 'string', ['unique' => true]) ->addTimestamps() // created_at と updated_atカラム追加 ->create(); } }
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 - マイグレーション実行: プロジェクトルートでマイグレーションコマンドを実行し、
users
テーブルを作成します。bash重要: 下記のデータベース操作サンプルコードを実行する前に、データベース作成とマイグレーションは必ず完了してください。vendor/bin/phinx migrate
1
illuminate/database コンポーネントの利用
Laravel のデータベースコンポーネント(illuminate/database
)を ORM/クエリビルダーとして使います。
illuminate/database のインストール: プロジェクトルートで実行
- macOS:
/Applications/ServBay/www/servbay-slim-app
- Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require illuminate/database
1- macOS:
public/index.php
で DB 接続初期化:require __DIR__ . '/../vendor/autoload.php';
のすぐ後、Slim の$app = AppFactory::create();
より前に、DB 接続設定コードを追加します。php// ... 他の require や use の記述 ... use Illuminate\Database\Capsule\Manager as Capsule; // Capsuleマネージャのインポート // Eloquent ORM の初期化 $capsule = new Capsule; // データベース接続設定(利用DBによって driver・他項目調整) $capsule->addConnection([ 'driver' => 'mysql', // または 'pgsql' 'host' => '127.0.0.1', 'database' => 'servbay_slim_app', // DB名 'username' => 'root', // DBユーザー名 'password' => 'password', // DBパスワード 'charset' => 'utf8mb4', // MySQL推奨 'collation' => 'utf8mb4_unicode_ci', // MySQL推奨 'prefix' => '', // PostgreSQLの場合は schema を追加 // 'schema' => 'public', ]); // グローバル利用設定 $capsule->setAsGlobal(); // Eloquent 起動 $capsule->bootEloquent(); // ... Slimインスタンス生成 ...
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
MySQL の例
ServBay で MySQL パッケージ起動、servbay_slim_app
DB 作成、Phinx で users
テーブルも用意済みとします。
public/index.php
の $app->run();
前に以下ルートを追加してください。
php
// ... 初期化コードと '/' ルート ...
use Illuminate\Database\Capsule\Manager as Capsule; // インポート済み確認
// ユーザー追加ルート
$app->get('/mysql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay Demo User',
'email' => 'servbay-demo-' . time() . '@servbay.test', // time() でメール一意
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to MySQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500); // エラー時はステータス変更
}
return $response;
});
// ユーザー取得ルート
$app->get('/mysql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson()); // 結果を JSON 出力
$response = $response->withHeader('Content-Type', 'application/json'); // Content-Type 設定
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
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
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
アクセス:
https://servbay-slim-test.local/mysql-add-user
でusers
テーブルへ新規ユーザー追加https://servbay-slim-test.local/mysql-get-users
でユーザー情報を取得して JSON 出力
PostgreSQL の例
ServBay で PostgreSQL パッケージ起動、servbay_slim_app
DB 作成、Phinx で users
テーブルも用意済みとします(Phinx設定 adapter・port を pgsql
・5432
に)。
public/index.php
の DB接続設定で driver
を pgsql
、schema
を追加してください。
php
$capsule->addConnection([
'driver' => 'pgsql', // pgsql に変更
'host' => '127.0.0.1',
'database' => 'servbay_slim_app',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8', // PostgreSQLは utf8
'prefix' => '',
'schema' => 'public', // schema 指定
]);
// ... Eloquent 初期化は同じ ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
public/index.php
の $app->run();
前に以下ルートを追加:
php
// ... 初期化コード '/' ルート ...
// ... MySQL ルート(必要なら)...
use Illuminate\Database\Capsule\Manager as Capsule; // インポート済み確認
// ユーザー追加ルート
$app->get('/pgsql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay PG Demo User',
'email' => 'servbay-pg-demo-' . time() . '@servbay.test', // time() でメール一意
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to PostgreSQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ユーザー取得ルート
$app->get('/pgsql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson());
$response = $response->withHeader('Content-Type', 'application/json');
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
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
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
アクセス:
https://servbay-slim-test.local/pgsql-add-user
で PostgreSQL のusers
テーブルへ新規ユーザー追加https://servbay-slim-test.local/pgsql-get-users
でユーザー情報を取得し JSON 出力
Memcached の例
ServBay には Memcached パッケージと PHP の ext-memcached
拡張が組み込まれています。PHP クライアントライブラリ(memcached/memcached
)のみ追加導入すれば利用可能です。
Memcached クライアントライブラリのインストール: プロジェクトルートで実行
- macOS:
/Applications/ServBay/www/servbay-slim-app
- Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require memcached/memcached
1- macOS:
public/index.php
に Memcached 用ルート追加:$app->run();
前に追加php// ... 初期化コードと DB ルート ... // Memcached 利用ルート $app->get('/memcached-example', function (Request $request, Response $response, $args) { // Memcachedクライアントインスタンス生成 $memcached = new Memcached(); // ServBay標準ポート(127.0.0.1:11211)でサーバ追加 $memcached->addServer('127.0.0.1', 11211); $cacheKey = 'my_servbay_cache_key'; // キャッシュからデータ取得 $cachedData = $memcached->get($cacheKey); if ($cachedData === false) { // キャッシュ未登録ならデータ生成して保存 $cachedData = 'Hello Memcached from ServBay! This was not cached.'; // TTL(生存時間)60秒でキャッシュ $memcached->set($cacheKey, $cachedData, 60); $response->getBody()->write($cachedData); } else { // キャッシュ済の場合はそのデータを返却 $response->getBody()->write('Hello Memcached from ServBay! This was served from cache.'); } return $response; }); // ... $app->run();
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
アクセス: https://servbay-slim-test.local/memcached-example
へアクセス。初回は "This was not cached."、キャッシュ生存中は "This was served from cache." と表示。
Redis の例
ServBay には Redis パッケージと PHP の ext-redis
拡張が組み込まれています。PHP クライアントライブラリ(predis/predis
)追加で簡便に扱えます。
Redis クライアントライブラリのインストール: プロジェクトルートで
- macOS:
/Applications/ServBay/www/servbay-slim-app
- Windows:
C:\ServBay\www\servbay-slim-app
bashcomposer require predis/predis
1- macOS:
public/index.php
に Redis 用ルート追加:$app->run();
前にphp// ... 初期化コードとデータベースルート ... // ... Memcached ルート(必要なら)... use Predis\Client as RedisClient; // Predis クライアントクラスのインポート // Redis 利用ルート $app->get('/redis-example', function (Request $request, Response $response, $args) { try { // Redisクライアント生成(ServBayは 127.0.0.1:6379) $redis = new RedisClient([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, ]); $cacheKey = 'my_servbay_redis_cache_key'; // キャッシュからデータ取得 $cachedData = $redis->get($cacheKey); if ($cachedData === null) { // キャッシュ未登録ならデータ生成して保存 $cachedData = 'Hello Redis from ServBay! This was not cached.'; // SETEX で有効期限 60秒付きでキャッシュ $redis->setex($cacheKey, 60, $cachedData); $response->getBody()->write($cachedData); } else { // キャッシュ済の場合はそのデータを返却 $response->getBody()->write('Hello Redis from ServBay! This was served from cache.'); } } catch (\Exception $e) { // 例外(接続・操作失敗)捕捉 $response->getBody()->write('Error connecting to Redis or performing operation: ' . $e->getMessage()); $response = $response->withStatus(500); } return $response; }); // ... $app->run();
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
アクセス: https://servbay-slim-test.local/redis-example
へアクセス。初回は "This was not cached."、キャッシュ生存中は "This was served from cache." と表示。
まとめ
これらのステップを通して、ServBay ローカル開発環境で Slim Framework プロジェクトの作成、ServBay の ウェブサイト設定による公開・アクセスを実現できました。加えて、ServBay が提供する各種 パッケージ(MySQL、PostgreSQL、Memcached、Redis)および PHP 拡張を活用し、Slim アプリケーションにデータベースやキャッシュ統合も可能となります。ServBay を使えば、ローカル環境の構築や運用がシンプルになり、Slim 開発そのものに集中できます。