はじめに
Slim Frameworkで開発を進めるにあたり知っていると役に立ちそうだが、公式のドキュメントには乗っていない(フレームワークのコードを読まないと分からない)細かい部分についてまとめていきます。
実際に筆者がSlimフレームワークで開発するにあたり「どうやって実装したらいいんだろう」「この実装って正しいのだろうか」と疑問に思い、公式のドキュメントを読んでわかった仕様についてまとめていきます。
この記事は必要に応じて追記していきます。また、公式のユーザーガイドに乗っているような超基本的なことについてはこの記事ではまとめません。
バージョン
- Slim Framework 3系を対象に書いています
参考
- Slim Framework - Slim Framework (Slim Framework公式ページ)
- 基本的な仕様については上記ページの User Guide (英語ですが...)を確認すると良いです。*1
- GitHub - slimphp/Slim: Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs.
- ソースコードです
Request
SlimのSlim\Http\Request
クラス周りの細かい仕様についてです。Slimのソースコードでは、Slim/Http/Request.php
が本体になります。
継承関係
継承関係は以下のようになっています。
Slim\Http\Request extends Slim\Http\Message implements Psr\Http\Message\ServerRequestInterface
となっています。詳細な継承関係は以下の通りです。
class Slim\Http\Request
class Slim\Http\Message
interface Psr\Http\Message\MessageInterface
interface Psr\Http\Message\ServerRequestInterface
つまり、SlimはPsrの MessageInterface
、ServerRequestInterface
を実装しています。
しかし、Slim\Http\Request
には、各種Interfaceには定義されていない便利なメソッドが多く存在しているので、型アノテーションする時は Slim\Http\Request
で扱うことが多いでしょう。
Psr\Http\Message\MessageInterface と Psr\Http\Message\ServerRequestInterface
http-message という、http(s)でやり取りされるメッセージをやり取りを表現したInterfaceの集合です。
MessageInterface では、 protocol, header, body, というHTTP通信の内部を扱うメソッドが定義されています。
ServerRequestInterfaceは、RequestInrerfaceを継承しており、サーバーで受け取ったCookieやQueryParam、Bodyなどの情報をパースして扱うメソッドが定義されています。RequestInterfaceも結局はMessageInterfaceを継承しています。
Requestクラスで定義されているHTTP Method
Requestクラスで定義されているHTTP Methodは以下の通りです。
- CONNECT
- DELETE
- GET
- HEAD
- OPTIONS
- PATCH
- POST
- PUT
- TRACE
Request::getParam($key, $default = null)
Slim\Http\Request
クラスに定義されているメソッドです。
- QueryParam(URLの
?key=value
の部分)またはPOST Bodyに含まれるパラメータを取得できます。 - 両方に同じkeyが含まれていた場合はPOST Bodyの方が優先されます。
- 必ずstring型で取得します。intやarrayによしなに変換されることはありません。
- PATHパラメータ(/users/{userId} のようなパラメータ)はこのメソッドでは取得することができません。
Slim\Http\Request
に定義されているSlim独自のメソッドです。ServerRequestInterface
などPsrのインタフェースには定義されていません。
Request::getMethod()
"GET"
,"POST"
,"DELETE"
など、文字列でHTTPメソッドが取得できます。
*1:気が向いたら日本語の翻訳を出すかも