グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



PHPのマイクロフレームワーク「Slim4」の「slim-skeleton」を使用してハマったこと

Slim は PHP のマイクロフレームワークです。
アプリケーション開発までのセットアップを短時間でできるように、公式で slim-skeleton を提供しています。

今回は PHP のバージョン 7.2 以降で使用可能な Slim4 を使用してハマったことの記録です。


記事で使用した slim-skeleton のバージョンは 4.1.0 になります。


slim-skeleton のインストール

composer 公式イメージを使ってslim-skeletonをインストールしてきます。

開発環境(Docker)の準備

slim-skeleton の公式リポジトリから作成したプロジェクトには docker-compose.yml が付属しています。

docker-compose.yml

この記事ではデフォルト提供の docker-compose.yml で定義されているPHPのビルトインサーバを使用します。

以下のコマンドで Docker を起動します。

curl コマンドでPHPのビルトインサーバが起動されていることを確認します。

開発環境の準備は以上です。

サブディレクトリ運用でハマったこと

Slim3 まではサブディレクトリでシステムを扱う場合でも特別な設定は必要なかったのですが、 Slim4 をサブディレクトリで運用する場合には別途設定が必要になったようです。

public/index.php

ハードコードが嫌な場合は以下の関数で設定すればいいようです。

Loggerの設定でハマったこと

デフォルトでは Slim のLoggerを使用しており、PHPの error_log() 関数が使用されるようになっています。

Logger を Monolog に変更しようとしたときの試行錯誤です。
Monolog は slim-skeleton でプロジェクトを立ち上げると vendor に既に追加されているので、Monolog を使うように変更します。

意図的に例外を発生させてログに出力されるか動作を確認してみます。

ListUserAction.php

 http://localhost:8080/users にリクエストを飛ばしてエラーログが出るか確認してみます。

slim-skeleton のログ出力は特に設定していないと Docker 経由だと標準出力に出力されます。 以下のコマンドでログを確認します。

例外がログに出力されるようになりましたが、PHP の Notice と Warning がログに出力されていません。
slim-skeleton で提供されている ShutdownHandler.php の以下の引数を変更すると出力されるようになりました。

src/Application/Handlers/ShutdownHandler.php

プロダクション環境では app/settings.php の displayErrorsの値を false にしてエンドユーザーにはエラー詳細を見せない形にすると思いますが、 困ったことに displayErrors の値を false にすると、ログに出力されるエラーの詳細も非表示になってしまいます。

app/settings.php

内部的には Slim\App::addErrorMiddleware メソッド で Slim\Middleware\ErrorMiddleware インスタンス作成時のコンストラクタの第4、第5引数に $logErrors と $logErrorDetails が渡されています。

ErrorMiddleware が使用されるのは  register_shutdown_function()  で登録された ShutdownHandler.php のここで ShutdownHandler クラスのコンストラクタに渡した HttpErrorHandler のインスタンスを実行しています。

HttpErrorHandler クラスでは  __invoke メソッド は実装されておらず、その継承元の Slim\Handlers\ErrorMiddleware のここでログ出力の有無を振り分けているようです。

この辺り slim-skeleton のアプリケーションコードから Slim4 のコードに飛んだり、Slim4 のコードが基底クラスとなって slim-skeleton の子クラスを呼び出していたりと理解が難しい印象です。

ShutdownHandler の $displayErrorDetails  を HttpErrorHandler に渡しているので、ログ出力の時とレスポンスの時とでエラー詳細の表示/非表示が同じ値を参照するようになっていて、レスポンスにはエラー詳細を非表示、ログ出力時にはエラー詳細を表示するといった Noticeや Warning の細かいログ出力設定方法を見つけられませんでした。

slim-skeleton のディレクトリデザイン

ハマったことではないですが、公式の slimphp/slim-skeleton のディレクトリデザインは ADRパターン (Action Domain Responder) に沿って作られているようです。

ShutdownHandler.php と HttpErrorHandler.php と Actions が密接に絡み合っているので、別のディレクトリデザインパターンを採用する時には slim-skeleton 経由でプロジェクトを作成するより Slim4 をインストールして1からプロジェクトを作成した方がいいかもしれません。

まとめ

Slim4 slim-skeleton を使用してハマったことの一部をご紹介しました。

同じような問題を抱えている方の助けになれば幸いです。


この記事のカテゴリ

FOLLOW US

最新の情報をお届けします