こんにちは。よっしーです(^^)
今日は、PHPのslimフレームワークを使用した開発環境についてご紹介します。
背景
PHPのslimフレームワークを使用したRESTful APIを開発する機会がありましたので、ローカルにおける開発環境をDockerで構築してみたいと思います。
まずは、nginxとPHP-FPMを使用して、「Hello, World!!」を表示させる環境を作成します。
環境構築
下記のファイルを用意します。ファイルの中身は、下記の各セクションに記載しています。
ルートディレクトリ
├── Makefile
├── README.md
└── app
├── compose.yml
├── nginx
│ ├── Dockerfile
│ └── default.conf
└── php-fpm
├── Dockerfile
└── slim_app
├── composer.json
└── public
└── index.php
app/nginx/Dockerfile
FROM nginx:1.24-alpine
app/nginx/default.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
root /var/www/slim_app/public;
index index.php;
error_log /var/log/nginx/app.error.log;
access_log /var/log/nginx/app.error.log;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass php-fpm:9000;
}
}
app/php-fpm/Dockerfile
FROM php:8.2-fpm
WORKDIR /var/www
CMD php-fpm
RUN chown www-data:www-data /var/www/
app/php-fpm/slim_app/composer.json
{
"require": {
"slim/slim": "4.*",
"slim/psr7": "^1.6"
}
}
app/php-fpm/slim_app/public/index.php
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function (Request $request, Response $response, $args) {
$response->getBody()->write("Hello world!");
return $response;
});
$app->run();
Makefile
SHELL = /bin/bash
WOKR_DIR = ./app
.DEFAULT_GOAL := help
# アプリのセットアップ
.PHONY: setup
setup:
@make composer_install
@make build
# コンテナビルド
.PHONY: build
build:
cd $(WOKR_DIR) \
&& docker compose build
# composer install
.PHONY: composer_install
composer_install:
cd $(WOKR_DIR)/php-fpm/slim_app \
&& composer install
# アプリの起動
.PHONY: up
up:
cd $(WOKR_DIR) \
&& docker compose up -d
# アプリの停止
.PHONY: down
down:
cd $(WOKR_DIR) \
&& docker compose down
# コンテナの状態確認
.PHONY: ps
ps:
cd $(WOKR_DIR) \
&& docker compose ps
# help
.PHONY: help
help:
@grep -B 2 -E '^[a-zA-Z_-]+:' Makefile \
| grep -v '.PHONY' \
| grep -v -E '^\s*$$' \
| tr '\n' ',' \
| sed 's/--,/\n/g' \
| awk -F, '{printf "%-20s %s\n", $$2, $$1}'
動作確認
上記のファイルが用意できたら、下記のコマンドを実行します。
make setup
make up
ブラウザで、「http://localhost:8080/」にアクセスして、下記のような画面になれば成功です。
解説
app/nginx/default.conf
このコードはNginxの設定ファイルに含まれるサーバーブロック(serverブロック)の例です。以下、コードの各部分の解説を行います。
listen
ディレクティブ:listen 80 default_server;
とlisten [::]:80 default_server;
の2つのディレクティブがあります。listen
ディレクティブは、Nginxがリクエストを受け付けるポートを指定します。80
はポート番号であり、default_server
はデフォルトのサーバーブロックとして設定されていることを意味します。[::]
はIPv6アドレスの省略形で、IPv6の接続を受け付けるための設定です。
server_name
ディレクティブ:server_name localhost;
というディレクティブがあります。server_name
ディレクティブは、サーバーブロックが応答するドメイン名を指定します。- この例では、
localhost
というドメイン名に対してリクエストを処理します。
root
ディレクティブ:root /var/www/slim_app/public;
というディレクティブがあります。root
ディレクティブは、ドキュメントルート(Webサーバーがコンテンツを提供するディレクトリのパス)を指定します。- この例では、
/var/www/slim_app/public
ディレクトリがドキュメントルートとして設定されています。
index
ディレクティブ:index index.php;
というディレクティブがあります。index
ディレクティブは、ディレクトリ内のファイルが指定されなかった場合に表示するデフォルトのファイルを指定します。- この例では、
index.php
がデフォルトのファイルとして設定されています。
error_log
ディレクティブ:error_log /var/log/nginx/app.error.log;
というディレクティブがあります。error_log
ディレクティブは、エラーログのファイルパスを指定します。- この例では、
/var/log/nginx/app.error.log
がエラーログのファイルパスとして設定されています。
access_log
ディレクティブ:access_log /var/log/nginx/app.error.log;
というディレクティブがあります。access_log
ディレクティブは、アクセスログのファイルパスを指定します。- この例では、
/var/log/nginx/app.error.log
がアクセスログのファイルパスとして設定されています。
location /
ブロック:location / { ... }
というブロックがあります。location
ブロックは、リクエストのパスに基づいて動作を設定するために使用されます。/
はルートパス(ドキュメントルート)を意味し、すべてのリクエストに対してこのブロックが適用されます。try_files
ディレクティブは、ファイルが存在しない場合に代替のリソースを試すために使用されます。- この例では、リクエストされたURIが存在しない場合に
index.php
に処理を渡します。
location ~ \.php
ブロック:location ~ \.php { ... }
というブロックがあります。- このブロックは正規表現を使用して、
.php
で終わるURIに対して動作を設定します。 fastcgi_split_path_info
ディレクティブは、URI内の情報を分割してFastCGIパラメータに渡すために使用されます。include fastcgi_params;
ディレクティブは、FastCGIパラメータを含む外部の設定ファイルをインクルードします。fastcgi_param
ディレクティブは、FastCGIパラメータを設定します。fastcgi_index
ディレクティブは、FastCGIのデフォルトのインデックスファイルを指定します。fastcgi_pass
ディレクティブは、FastCGIサーバー(PHP-FPM)のアドレスとポートを指定します。
以上が、Nginxの設定ファイルの解説です。この設定では、ドキュメントルート内のPHPファイルを処理し、エラーログとアクセスログを指定のファイルに記録します。また、リクエストされたURIが存在しない場合はindex.php
に処理を渡します。
app/php-fpm/slim_app/public/index.php
このコードはSlim Frameworkを使用して簡単なWebアプリケーションを作成するためのPHPのスクリプトです。以下、コードの各部分の解説を行います。
use
ステートメント:use
ステートメントは、特定の名前空間からクラスやインターフェースをインポートします。- このコードでは、
Psr\Http\Message\ResponseInterface
とPsr\Http\Message\ServerRequestInterface
の2つのインターフェースをインポートしています。
require
ステートメント:require
ステートメントは、指定されたファイルを読み込みます。- このコードでは、
../vendor/autoload.php
ファイルを読み込んでいます。 - これは、Composerによって生成されたオートローダーファイルで、依存関係のあるクラスやファイルを自動的に読み込むために使用されます。
AppFactory::create()
:AppFactory
クラスのcreate()
メソッドを呼び出して、Slimアプリケーションのインスタンスを作成しています。AppFactory
はSlim Frameworkが提供するファクトリクラスで、簡単にSlimアプリケーションを作成するためのメソッドを提供します。
$app->get('/', ...)
:$app
オブジェクトのget()
メソッドを呼び出して、HTTP GETリクエストに対する処理を定義しています。'/'
はルートパスを意味し、アプリケーションのホームページにアクセスされた場合にこの処理が実行されます。- 無名関数(クロージャ)が渡されており、リクエストオブジェクト、レスポンスオブジェクト、および引数を受け取ります。
- 関数の中で、レスポンスオブジェクトの
getBody()
メソッドを呼び出して、レスポンスボディに"Hello world!"
というテキストを書き込んでいます。 - 最後に、レスポンスオブジェクトを返しています。
$app->run()
:$app
オブジェクトのrun()
メソッドを呼び出して、Slimアプリケーションを実行します。- これにより、アプリケーションがリクエストを受け付け、適切なルートに基づいて処理を実行します。
このコードは、Slim Frameworkを使用してシンプルなルート(ホームページ)を作成し、リクエストがあるたびに「Hello world!」というテキストを返すアプリケーションを作成しています。
app/php-fpm/slim_app/composer.json
下記のコマンドで作成しました。
composer require slim/slim:"4.*"
composer require slim/psr7
おわりに
今日は、slimフレームワークを使用した開発環境についてご紹介しました。
この記事で使用した内容は下記のサイトを参考にしています。
本記事でご紹介したソースは、下記のリポジトリにあります。
https://github.com/Gate-Yossi/Ran/releases/tag/v2023.07.12
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント