猫でもわかるWeb開発・プログラミング

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

PHP Slim Framework を使いこなすための仕様詳細 ※順次追記していきます

f:id:yoshiki_utakata:20181113093656p:plain

はじめに

Slim Frameworkで開発を進めるにあたり知っていると役に立ちそうだが、公式のドキュメントには乗っていない(フレームワークのコードを読まないと分からない)細かい部分についてまとめていきます。

実際に筆者がSlimフレームワークで開発するにあたり「どうやって実装したらいいんだろう」「この実装って正しいのだろうか」と疑問に思い、公式のドキュメントを読んでわかった仕様についてまとめていきます。

この記事は必要に応じて追記していきます。また、公式のユーザーガイドに乗っているような超基本的なことについてはこの記事ではまとめません。

バージョン

  • Slim Framework 3系を対象に書いています

参考

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の MessageInterfaceServerRequestInterface を実装しています。

しかし、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:気が向いたら日本語の翻訳を出すかも