slim入門:Dockerでつくる開発環境

スポンサーリンク
slim入門:Dockerでつくる開発環境 ノウハウ
slim入門:Dockerでつくる開発環境
この記事は約11分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、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ブロック)の例です。以下、コードの各部分の解説を行います。

  1. listenディレクティブ:
    • listen 80 default_server;listen [::]:80 default_server;の2つのディレクティブがあります。
    • listenディレクティブは、Nginxがリクエストを受け付けるポートを指定します。
    • 80はポート番号であり、default_serverはデフォルトのサーバーブロックとして設定されていることを意味します。
    • [::]はIPv6アドレスの省略形で、IPv6の接続を受け付けるための設定です。
  2. server_nameディレクティブ:
    • server_name localhost;というディレクティブがあります。
    • server_nameディレクティブは、サーバーブロックが応答するドメイン名を指定します。
    • この例では、localhostというドメイン名に対してリクエストを処理します。
  3. rootディレクティブ:
    • root /var/www/slim_app/public;というディレクティブがあります。
    • rootディレクティブは、ドキュメントルート(Webサーバーがコンテンツを提供するディレクトリのパス)を指定します。
    • この例では、/var/www/slim_app/publicディレクトリがドキュメントルートとして設定されています。
  4. indexディレクティブ:
    • index index.php;というディレクティブがあります。
    • indexディレクティブは、ディレクトリ内のファイルが指定されなかった場合に表示するデフォルトのファイルを指定します。
    • この例では、index.phpがデフォルトのファイルとして設定されています。
  5. error_logディレクティブ:
    • error_log /var/log/nginx/app.error.log;というディレクティブがあります。
    • error_logディレクティブは、エラーログのファイルパスを指定します。
    • この例では、/var/log/nginx/app.error.logがエラーログのファイルパスとして設定されています。
  6. access_logディレクティブ:
    • access_log /var/log/nginx/app.error.log;というディレクティブがあります。
    • access_logディレクティブは、アクセスログのファイルパスを指定します。
    • この例では、/var/log/nginx/app.error.logがアクセスログのファイルパスとして設定されています。
  7. location /ブロック:
    • location / { ... }というブロックがあります。
    • locationブロックは、リクエストのパスに基づいて動作を設定するために使用されます。
    • /はルートパス(ドキュメントルート)を意味し、すべてのリクエストに対してこのブロックが適用されます。
    • try_filesディレクティブは、ファイルが存在しない場合に代替のリソースを試すために使用されます。
    • この例では、リクエストされたURIが存在しない場合にindex.phpに処理を渡します。
  8. 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のスクリプトです。以下、コードの各部分の解説を行います。

  1. useステートメント:
    • useステートメントは、特定の名前空間からクラスやインターフェースをインポートします。
    • このコードでは、Psr\Http\Message\ResponseInterfacePsr\Http\Message\ServerRequestInterfaceの2つのインターフェースをインポートしています。
  2. requireステートメント:
    • requireステートメントは、指定されたファイルを読み込みます。
    • このコードでは、../vendor/autoload.phpファイルを読み込んでいます。
    • これは、Composerによって生成されたオートローダーファイルで、依存関係のあるクラスやファイルを自動的に読み込むために使用されます。
  3. AppFactory::create():
    • AppFactoryクラスのcreate()メソッドを呼び出して、Slimアプリケーションのインスタンスを作成しています。
    • AppFactoryはSlim Frameworkが提供するファクトリクラスで、簡単にSlimアプリケーションを作成するためのメソッドを提供します。
  4. $app->get('/', ...):
    • $appオブジェクトのget()メソッドを呼び出して、HTTP GETリクエストに対する処理を定義しています。
    • '/'はルートパスを意味し、アプリケーションのホームページにアクセスされた場合にこの処理が実行されます。
    • 無名関数(クロージャ)が渡されており、リクエストオブジェクト、レスポンスオブジェクト、および引数を受け取ります。
    • 関数の中で、レスポンスオブジェクトのgetBody()メソッドを呼び出して、レスポンスボディに"Hello world!"というテキストを書き込んでいます。
    • 最後に、レスポンスオブジェクトを返しています。
  5. $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

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました