
こんにちは。よっしーです(^^)
今日は、slimフレームワークのslim-skeletonを利用する方法についてご紹介します。
前提
この記事は下記の記事をベースにしています。
背景
先日構築したslimフレームワークのローカル開発環境ですが、index.phpのみだったため、今回はslim-skeletonを適用したので、その時の方法をご紹介します。
修正内容
下記のコマンドを実行します。
rm -rf app/php-fpm/slim_app
docker run --rm -it -v ./app/php-fpm:/app composer create-project slim/slim-skeleton slim_app
次に下記のコマンドを実行します。
make setup
make up
ブラウザで、「http://localhost:8080/」にアクセスして、下記のような画面になれば成功です。

解説
Slim Skeletonとは
Slim Skeletonは、Slim Frameworkを使用したWebアプリケーションのベースとなるスケルトン(骨組み)プロジェクトです。Slim Frameworkは、マイクロフレームワークとして知られており、軽量でシンプルながらもパワフルなWebアプリケーションの構築をサポートします。
Slim Skeletonは、Slim Frameworkを利用する新しいプロジェクトを始める際のスターターキットとして使用されます。このスケルトンには、Slim Frameworkの基本的な設定やディレクトリ構造が含まれており、開発を素早く開始するのに役立ちます。
Slim Skeletonの特徴と利点:
- 軽量かつシンプル: Slim Frameworkは、軽量なマイクロフレームワークであり、必要最小限の機能を提供します。これにより、シンプルで効率的なアプリケーションの開発が可能です。
- 柔軟なルーティング: Slim Frameworkは、簡潔なルーティング構文を提供し、柔軟なルーティング設定が可能です。URLパターンと対応するコールバック関数を定義することで、リクエストを処理するエンドポイントを作成できます。
- PSR-7準拠のリクエストとレスポンス: Slim Frameworkは、PSR-7に準拠したリクエストとレスポンスオブジェクトを使用します。これにより、互換性のあるコンポーネントやミドルウェアを組み合わせて使用できるメリットがあります。
- 依存性注入(DI)のサポート: Slim Frameworkは、DIコンテナを統合しており、依存性の注入を容易に行うことができます。これにより、コードのテストや保守性の向上が可能となります。
- 豊富な拡張機能: Slim Frameworkは、多くの拡張機能やミドルウェアが利用可能です。これにより、セッション管理、認証、ログ、キャッシュなどの機能を追加することができます。
Slim Skeletonは、これらの特徴と利点を持つSlim Frameworkの基本的なプロジェクト構造と設定を提供し、開発者が効率的かつ柔軟にWebアプリケーションを開発するのに役立ちます。
app/php-fpm/slim_app/app/dependencies.php
このコードは、PHPの依存性注入(DI)コンテナであるPHP-DIを使用して、ロギングのための設定を行うためのファクトリ関数を定義しています。
コード全体の目的は、DIコンテナが要求されたときにLoggerInterfaceの実装インスタンスを作成して返すことです。
まず、declare(strict_types=1)は厳密な型チェックを有効にするための宣言です。
次に、useステートメントを使用して、必要なクラスをインポートしています。これらのクラスは、Monologライブラリを使用してロギング機能を実装するために必要です。
その後、return文を使用して、ファクトリ関数自体を定義しています。この関数は、ContainerBuilderクラスのインスタンスを受け取ります。
$containerBuilder->addDefinitions([...])は、DIコンテナに対して定義を追加するためのメソッドです。ここでは、LoggerInterfaceをキーとし、無名関数を値とする定義を追加しています。
無名関数の本体では、ContainerInterfaceのインスタンスを受け取ります。このコンテナは、依存関係の解決に使用されます。
まず、$settings = $c->get(SettingsInterface::class)を使用して、DIコンテナからSettingsInterfaceの実装インスタンスを取得しています。この設定は、ロガーの設定情報を含んでいます。
次に、取得した設定を使用して、新しいLoggerインスタンスを作成します。ロガーの名前は、設定から取得されます。
$processor = new UidProcessor()は、MonologのUidProcessorを使用して、各ログレコードに一意の識別子を追加するプロセッサを作成します。これにより、ログメッセージが追加の識別情報を持つようになります。
次に、StreamHandlerを作成します。これは、ログレコードをストリーム(ファイル)に書き込むためのハンドラです。ハンドラのパスとログレベルも、設定から取得されます。
最後に、作成したプロセッサとハンドラをロガーに追加し、作成したロガーインスタンスを返します。
このファクトリ関数は、DIコンテナがLoggerInterfaceのインスタンスを要求されたときに呼び出され、必要な設定を使用してロガーを作成します。
app/php-fpm/slim_app/app/middleware.php
このコードは、Slim Frameworkアプリケーションにセッションミドルウェアを追加するための設定を行っています。
まず、declare(strict_types=1)は厳密な型チェックを有効にするための宣言です。
次に、useステートメントを使用して、必要なクラスをインポートしています。AppクラスはSlim Frameworkのアプリケーションクラスであり、SessionMiddlewareはセッション管理のためのミドルウェアクラスです。
その後、return文を使用して、アプリケーションにセッションミドルウェアを追加するためのファクトリ関数自体を定義しています。この関数は、Appクラスのインスタンスを受け取ります。
$app->add(SessionMiddleware::class)は、Slim Frameworkのアプリケーションに対して、セッションミドルウェアを追加するためのメソッドです。SessionMiddleware::classはクラス名を指定しています。このミドルウェアは、リクエストとレスポンスの間でセッションを処理する役割を担います。
このファクトリ関数は、Slim Frameworkのアプリケーションが作成されたときに呼び出され、セッションミドルウェアがアプリケーションに追加されます。セッションミドルウェアは、セッションの管理や状態の保持に使用されるため、この設定はセッションの処理を有効にする役割を果たします。
app/php-fpm/slim_app/app/repositories.php
このコードは、DIコンテナの設定で、UserRepositoryインターフェースをそのインメモリ実装であるInMemoryUserRepositoryにマッピングするための設定を行っています。
まず、declare(strict_types=1)は厳密な型チェックを有効にするための宣言です。
次に、useステートメントを使用して、必要なクラスをインポートしています。UserRepositoryはアプリケーションのドメイン層で定義されたインターフェースであり、InMemoryUserRepositoryはその実装クラスです。また、ContainerBuilderはDIコンテナを構築するためのビルダークラスです。
その後、return文を使用して、DIコンテナの設定を行うファクトリ関数を定義しています。この関数は、ContainerBuilderクラスのインスタンスを受け取ります。
$containerBuilder->addDefinitions([...])は、DIコンテナに対して定義を追加するためのメソッドです。ここでは、UserRepositoryをキーとし、InMemoryUserRepositoryを値とする定義を追加しています。
\DI\autowire(InMemoryUserRepository::class)は、InMemoryUserRepositoryクラスを自動ワイヤリングするためのDIコンテナの関数です。これにより、DIコンテナはUserRepositoryの依存関係を解決する際にInMemoryUserRepositoryを使用します。
このファクトリ関数は、DIコンテナがUserRepositoryのインスタンスを要求されたときに呼び出され、InMemoryUserRepositoryのインスタンスが作成されて返されます。これにより、アプリケーションの他の部分でUserRepositoryの依存性を解決する際に、実際にはInMemoryUserRepositoryが使用されるようになります。
app/php-fpm/slim_app/app/routes.php
このコードは、Slim Frameworkアプリケーションのルーティングを設定するためのファクトリ関数です。アプリケーションには、いくつかのエンドポイントが定義されています。
まず、declare(strict_types=1)は厳密な型チェックを有効にするための宣言です。
次に、useステートメントを使用して、必要なクラスとインターフェースをインポートしています。ListUsersActionはユーザー一覧を取得するためのアクションクラスであり、ViewUserActionは特定のユーザーの詳細を取得するためのアクションクラスです。また、ResponseはSlim Frameworkのレスポンスインターフェース、Requestはリクエストインターフェースです。AppはSlim Frameworkのアプリケーションクラスであり、Groupはルートグループのインターフェースです。
その後、return文を使用して、アプリケーションのルーティング設定を行うファクトリ関数を定義しています。この関数は、Appクラスのインスタンスを受け取ります。
$app->options('/{routes:.*}', ...)は、CORS(Cross-Origin Resource Sharing)プリフライトリクエストを処理するためのオプションリクエストハンドラを定義しています。これにより、全てのルートに対するオプションリクエストが処理され、レスポンスが返されます。
$app->get('/', ...)は、ルートパス (“/”) に対するGETリクエストハンドラを定義しています。このハンドラは、”Hello world!”というテキストをレスポンスのボディに書き込んで返します。
$app->group('/users', ...)は、”/users”というパスに対するグループを作成しています。このグループ内では、ListUsersActionに対するGETリクエストと、ViewUserActionに対するGETリクエストが定義されています。
$group->get('', ListUsersAction::class)は、ユーザー一覧を取得するためのGETリクエストハンドラを定義しています。このハンドラは、ListUsersActionクラスのインスタンスを使用して処理を実行します。
$group->get('/{id}', ViewUserAction::class)は、特定のユーザーの詳細を取得するためのGETリクエストハンドラを定義しています。{id}はユーザーのIDを表すパラメータであり、URLの一部として受け取ることができます。このハンドラは、ViewUserActionクラスのインスタンスを使用して処理を実行します。
このファクトリ関数は、Slim Frameworkのアプリケーションが作成されたときに呼び出され、ルーティングの設定がアプリケーションに適用されます。各エンドポイントへのリクエストが該当するハンドラで処理されるようになります。
app/php-fpm/slim_app/app/settings.php
このコードは、DIコンテナの設定で、アプリケーションの設定情報を提供するための設定を行っています。
まず、declare(strict_types=1)は厳密な型チェックを有効にするための宣言です。
次に、useステートメントを使用して、必要なクラスをインポートしています。Settingsはアプリケーションの設定情報を表すクラスであり、SettingsInterfaceは設定情報のインターフェースです。ContainerBuilderはDIコンテナを構築するためのビルダークラスです。LoggerはMonologライブラリのロガークラスです。
その後、return文を使用して、DIコンテナの設定を行うファクトリ関数を定義しています。この関数は、ContainerBuilderクラスのインスタンスを受け取ります。
$containerBuilder->addDefinitions([...])は、DIコンテナに対して定義を追加するためのメソッドです。ここでは、SettingsInterfaceをキーとし、無名関数を値とする定義を追加しています。
無名関数の本体では、Settingsクラスのインスタンスを作成しています。コンストラクタには、設定情報の配列が渡されます。この配列は、アプリケーションのグローバルな設定を表しています。
'displayErrorDetails' => trueは、エラーの詳細情報を表示するかどうかを指定しています。開発環境ではtrueに設定されているため、エラーの詳細情報が表示されますが、本番環境ではfalseに設定することが推奨されます。
'logError' => falseと'logErrorDetails' => falseは、エラーログの出力に関する設定です。開発環境ではエラーログの出力を無効にしています。
'logger'内の設定は、Monologライブラリのロギング設定です。'name'はロガーの名前を指定し、'path'はログファイルのパスを指定します。isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log'の部分は、Docker環境であれば標準出力にログを出力し、それ以外の環境では../logs/app.logというファイルにログを出力するようになっています。'level'はログレベルを指定します。ここではLogger::DEBUGとしています。
このファクトリ関数は、DIコンテナがSettingsInterfaceのインスタンスを要求されたときに呼び出され、アプリケーションの設定情報を提供するSettingsクラスのインスタンスが作成されて返されます。これにより、アプリケーションの他の部分で設定情報を依存性として解決する際に、作成されたSettingsオブジェクトが使用されるようになります。
app/php-fpm/slim_app/composer.json
このコードは、パッケージマネージャーであるComposerのためのcomposer.jsonファイルの内容です。このファイルは、Slim Frameworkスケルトンアプリケーションのプロジェクトの依存関係と設定を定義します。
"name": パッケージの名前。この場合はslim/slim-skeletonです。"description": パッケージの説明。"keywords": パッケージに関連するキーワードの配列。"homepage": パッケージのホームページのURL。"license": パッケージのライセンス。"authors": パッケージの著者情報の配列。各著者には名前、メールアドレス、ホームページのURLが含まれます。"require": 依存するパッケージとそのバージョンの指定。phpのバージョンが^7.4 || ^8.0以上であることが要求され、他にもSlim FrameworkやMonologなどのパッケージのバージョン指定が含まれています。"require-dev": 開発時にのみ必要な依存パッケージの指定。テストフレームワークや静的解析ツール、コード規約チェッカーなどが含まれます。"config": Composerの設定オプション。"allow-plugins"ではphpstan/extension-installerプラグインの使用を許可し、"process-timeout"ではプロセスのタイムアウトを無制限に設定しています。また、"sort-packages"はパッケージの順序を自動的にソートする設定です。"autoload": オートローディングの設定。psr-4オートローダーが定義されており、"App\\"の名前空間のクラスはsrc/ディレクトリ内にあることが期待されます。"autoload-dev": 開発時のオートローディングの設定。テストクラスはtests/ディレクトリ内にあることが期待されます。"scripts": Composerスクリプトの設定。"start"は内蔵のPHPサーバーを使ってアプリケーションを起動するコマンド、"test"はPHPUnitを実行するコマンドが定義されています。
このcomposer.jsonファイルは、Slim Frameworkスケルトンアプリケーションの依存関係と設定を一元管理するためのものであり、Composerを使用してプロジェクトを初期化する際に参照されます。
おわりに
今日は、slimフレームワークのslim-skeletonを利用する方法についてご紹介しました。
本記事でご紹介したソースは、下記のリポジトリにあります。

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



コメント