ServBayでSlimプロジェクトを作成し実行する
本記事では、強力なローカルWeb開発環境であるServBayを利用して、PHPベースのSlim Frameworkプロジェクトを素早く作成・設定・実行する方法を解説します。ServBayはPHP、Webサーバー(Caddy/Nginx/Apache)、多様なデータベースパッケージを統合提供しており、Slim開発に最適なプラットフォームです。
Slimとは?
Slimは、軽量でシンプルながら強力なWebアプリやAPIを迅速に構築するためのPHPマイクロフレームワークです。ルーティングやリクエスト・レスポンス処理の核となる機能を提供し、素早い開発・デプロイや、さらに大規模なアプリケーションの基礎にも最適です。
Slimの主な特徴とメリット
- 軽量性: Slimのコアコードベースは非常に小さく、リソース消費が少ないため、起動が高速でマイクロサービスや小・中規模アプリ開発に最適です。
- 柔軟性: 完全にプラガブルな設計で、テンプレートエンジン・ORM・認証ライブラリなどの外部ライブラリとも容易に組み合わせが可能。プロジェクトの要件に応じて最適なツールを選択できます。
- 使いやすさ: 洗練されたAPIと明快なドキュメントにより、コア概念を短時間で把握し、すぐに開発に着手できます。
- 高機能ルーティング: GET、POST、PUT、DELETEなど多様なHTTPメソッドへの対応や、ルートグループ・ミドルウェア・パラメータキャプチャなど高度なルーティングが可能です。
- ミドルウェア対応: ミドルウェアレイヤーを持ち、認証・ロギング・CORS対応などの処理を本体ロジックの前後で自在に挟めます。
SlimはRESTful APIの構築、プロトタイピング、特定機能の独立開発など、幅広い用途に適しています。
ServBayでSlimプロジェクトを作成・実行する
本ガイドでは、ServBayのプリセットPHP環境とWebサイト機能を活用し、シンプルな設定でSlimプロジェクトを立ち上げる方法を紹介します。
事前準備
開始前に、以下の準備をお済ませください。
- ServBayのインストールと起動: お使いのmacOSにServBayをインストールし、アプリを起動してください。
- Composer組み込み: ServBayにはComposerが標準搭載されているため、別途インストール不要です。
Slimプロジェクトの作成
ServBayでは、すべてのWebサイトプロジェクトを /Applications/ServBay/www
ディレクトリに統一保存することを推奨します。これにより、ServBayによるプロジェクト管理や設定が容易になります。
- サイトのルートディレクトリに移動:bash
cd /Applications/ServBay/www
1 - プロジェクトディレクトリの作成: 新規ディレクトリを作成してSlimプロジェクト用のスペースを確保します。bash
mkdir servbay-slim-app
1 - プロジェクトディレクトリに移動:bash
cd servbay-slim-app
1 - ComposerでSlimをインストール: プロジェクトディレクトリ内でSlimフレームワークとPSR-7実装を導入します。bashこのコマンドでSlim本体と
composer require slim/slim "^4.0" slim/psr7 -W
1slim/psr7
ライブラリがvendor
ディレクトリにセットアップされ、composer.json
とcomposer.lock
が生成されます。
Slimアプリの初期設定
- エントリーファイルの作成: Slimプロジェクトでは、すべてのリクエストを処理する1つのエントリーファイル(例:
public/index.php
)を用意します。まずpublic
ディレクトリと、その中にindex.php
を作成しましょう。bashmkdir public touch public/index.php
1
2 - エントリーファイルの編集:
public/index.php
をエディタで開き、以下の基本Slimアプリコードを追加します。phpこのコードで最もシンプルなSlimアプリが完成します。'/'にGETアクセスすると「Hello ServBay!」と返すルートを持っています。<?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(); // ルートURL'/'への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
ServBayのWebサイト設定
ブラウザからSlimプロジェクトにアクセスするには、ServBay上でWebサイト(旧バージョンでは「ホスト」と呼称)の設定が必要です。
- ServBayアプリを起動。
- サイドバーからWebサイト(Websites)機能を選択。
- 新しいWebサイトの追加をクリック。
- プロジェクト情報に合わせて各項目を入力:
- 名前 (Name):
My First Slim Dev Site
(お好きな名称で可) - ドメイン (Domain):
servbay-slim-test.local
(ローカル用には.local
や.test
の利用がおすすめ) - Webサイト種別 (Website Type):
PHP
- PHPバージョン (PHP Version): 必要なPHPバージョンを選択(例:
8.3
) - ドキュメントルート (Document Root): ブラウズでプロジェクトの
public
ディレクトリ(例:/Applications/ServBay/www/servbay-slim-app/public
)を指定。Slimのエントリーファイルindex.php
がこのpublic
内に置かれているため、Webサーバーはこのディレクトリを指す必要があります。
- 名前 (Name):
- 設定を保存すれば、ServBayが自動的にWebサーバー設定を更新し、反映します。
詳細な手順は初めてのWebサイトを追加も参照ください。
Slimサイトへアクセス
設定完了後、Webブラウザでhttps://servbay-slim-test.local
にアクセスしてください。
問題なければ、「Hello ServBay!」と画面に表示され、Slimプロジェクトが正しくServBayのWebサーバー経由で動作していることを確認できます。
データベース統合の例
Slim自体はDB抽象レイヤを持ちませんが、各種PHPデータベースライブラリとの連携が簡単です。ここではLaravelのEloquent ORM(illuminate/database
)を使い、MySQL・PostgreSQL接続例とMemcached・Redisの連携例も紹介します。
事前準備:データベース作成とマイグレーション実行
DB統合の前に、ServBayでデータベースを作り、必要なテーブル構造を用意します。
- データベースの作成:
- ServBayアプリで、使用するDBパッケージ(例:MySQLまたはPostgreSQL)に進みます。
- ServBay同梱の管理ツール(MySQL/MariaDB用phpMyAdmin、PostgreSQL用pgAdmin等)やCLIで新規DBを作成。例:
servbay_slim_app
。 - ServBayのDB rootユーザーのデフォルトパスワードは通常
password
です。詳細はServBayアプリで確認・変更可能です。
- Phinx(DBマイグレーションツール)導入と設定: PhinxはDB構造のバージョン管理に便利なPHP製マイグレーションツールです。
- プロジェクト直下
/Applications/ServBay/www/servbay-slim-app
でComposer経由でPhinxを導入:bashcomposer require robmorgan/phinx
1 - Phinx初期化:bashこれで
vendor/bin/phinx init
1phinx.yml
設定ファイルが直下に生成されます。適切なDB接続情報を編集・記載してください:yamlpaths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds' environments: default_migration_table: phinxlog default_environment: development # ご自身の環境名に応じて development: # 使用DB種別ごとに adapter: mysql # またはpgsql host: 127.0.0.1 name: servbay_slim_app # 作成したDB名 user: root pass: password # DBのパスワード port: 3306 # MySQLは3306、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. * * このメソッドでリバーシブルなマイグレーションを記述します。 * * 詳細は公式ドキュメントを参照してください: * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method * * Tableクラスでは"save()"ではなく、必ず"create()"または"update()"を呼び出してください。 */ 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 - マイグレーション実行: プロジェクトルートでPhinxコマンドを実行し、
users
テーブルを作成します。bash重要: 以下のDB接続サンプルを試す前に、DB作成・マイグレーションを必ず完了させてください。vendor/bin/phinx migrate
1
illuminate/databaseコンポーネント利用
LaravelのDBコンポーネント(illuminate/database
)をORM/クエリビルダとして利用します。
illuminate/database
のインストール: プロジェクト直下/Applications/ServBay/www/servbay-slim-app
で導入。bashcomposer require illuminate/database
1public/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接続設定(使用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アプリのインスタンス生成 ($app = AppFactory::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
MySQL利用例
すでにMySQL パッケージを起動し、servbay_slim_app
データベース作成とPhinxでusers
テーブル作成済みの前提です。
public/index.php
内の$app->run();
前に以下ルートを追加:
// ... 初期化コードや'/'ルート ...
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();
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利用例
PostgreSQL パッケージを利用し、servbay_slim_app
データベース・users
テーブルを作成済みの場合(Phinx設定のadapter
はpgsql
, port
は5432
になっていることを確認)。
public/index.php
のDB接続設定で、driver
をpgsql
にし、schema
も加えてください:
$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', // PostgreSQLはschema指定必須
]);
// ... Eloquent初期化コード等は同様 ...
2
3
4
5
6
7
8
9
10
11
public/index.php
の$app->run();
前に以下ルートを追加:
// ... 初期化コードや'/'ルート ...
// ... 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();
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クライアント導入: プロジェクト直下
/Applications/ServBay/www/servbay-slim-app
で依存パッケージをインストール。bashcomposer require memcached/memcached
1public/index.php
にMemcached用ルートを追加:$app->run();
前に次を追記します。php// ... 前の初期化やDBルート ... // Memcached利用ルート $app->get('/memcached-example', function (Request $request, Response $response, $args) { // Memcachedクライアントインスタンス作成 $memcached = new Memcached(); // 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
拡張も提供。クライアントライブラリとしてpredis/predis
を採用します。
Redisクライアント導入:
/Applications/ServBay/www/servbay-slim-app
内でコマンド実行。bashcomposer require predis/predis
1public/index.php
にRedis用ルート追加:$app->run();
前に記述。php// ... 初期化コードやDB・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) { // キャッシュがなければ作成し、Redisに保存(60秒TTL) $cachedData = 'Hello Redis from ServBay! This was not cached.'; $redis->setex($cacheKey, 60, $cachedData); // SETEX key seconds value $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
アクセス例:https://servbay-slim-test.local/redis-example
で初回アクセスは"This was not cached."、以降は(キャッシュ有効時は)"This was served from cache."が表示されます。
まとめ
ここまでで、ServBayのローカル開発環境にてSlim Frameworkプロジェクトを作成し、Webサイト機能で簡単に公開・アクセスする手順を習得できました。また、ServBayが提供する多様なパッケージ(MySQL, PostgreSQL, Memcached, Redis)やPHP拡張を活用したDB・キャッシュ統合方式もご紹介しました。ServBayを利用すれば、ローカル環境の構築・管理が格段に容易になり、Slimアプリ開発に集中できます。