Slim Framework を使ってみる Part.1(ひとまずルーティング登録まで)

3 min読了の目安(約2800字TECH技術記事

はじめに

やっぱり最初にするなら PHP でしょう!
という謎の勢いで、今までいわゆる PHP フレームワークを使ったことがないので、シンプル (らしい) な Slim Framework を試しつつ、慣れてみたいと思います。
Laravel も良いかなと考えましたが、今はアーキテクチャに慣れる事を優先で行きます。

https://www.slimframework.com

公式サイトのドキュメントと、以下の書籍を参考にさせて頂きました。(まだ最後まで読めていません)

https://www.socym.co.jp/book/1252

コピペになるとマズいので、私が学んだ部分をメインに書いていきます。

ことはじめ

composer からインストールできます。

% composer require slim/slim
% composer require slim/psr7

公式サイトに書いてあるスケルトンを作成するコマンドで導入しても良いのですが、色々なファイルが作成されてよくわからなくなるので今回はやめました。
わかってきたら、個人的にどちらが良いか考えます。

index.php を作る

ドキュメントルート配下に index.php を作成し、以下のコードを入力します。
(これは公式サイトからのコピペです)

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('/hello/{name}', function (Request $request, Response $response, array $args) { // ルーティング登録
    $name = $args['name'];
    $response->getBody()->write("Hello, $name");
    return $response;
});

$app->run(); // アプリケーションランナー
オートローダー

use でクラスを使う宣言をした時に、通常であれば require_once で対象の php ファイルも読み込ませる必要がありましたが、それを use 一つで同時に行ってくれる便利な仕組みです。
そういえば、昔 require_once を大量に書きまくってやっていたことを思い出します。
「require_once 地獄」とかなんとか。

ファクトリークラス

Slim\App というクラスが Slim Framework の核となるクラスで、その App クラスをインスタンス化して返してくれるクラスです。
何が嬉しいのかは現時点で不明ですが……。Slim Ver.3 の頃は直接 new していたようです。

ルーティング登録

各 http メソッド(get, post など)ごとに、 URL と実行する処理を登録します。
上のソースだと /hello という URL に get でアクセス (例:http://hogehoge/hello/) した時に実行されることになります。
{name} はルーティングプレースホルダと呼ばれ、 /hello/ 以降の文字列が渡されるので、http://hogehoge/hello/piyo とアクセスした場合は、 $args['name'] には piyo が入ってきます。
$_POST$_GETは使用しないということですね。
function (コールバック関数) については後述にて。

アプリケーションランナー

上記で登録されたルーティングを実行する箇所です。そのまんま。
ランナーと言っても、別に The blue bird flies away するワケではない。

ブラウザーでアクセスしてみる

これができたら、ブラウザーで http://localhost/hello/piyopiyo にアクセスすると

Hello, piyopiyo

が表示されます。やったね。

コールバック関数

  1. ServerRequestInterface
  2. ResponseInterface
  3. array

ServerRequestInterface

PSR-7 (PHP Standards Recommendations) で定義された規約にのっとった Interface を持ったオブジェクトです。
名前の通り、 HTTP リクエストに関する情報が含まれています。

Interface なので、準拠していれば他のインスタンスを使うこともできるハズ。

ResponseInterface

こちらも PSR-7 対応のオブジェクト。
HTTP レスポンスに関する情報が含まれています。

イミュータブルなオブジェクトとのこと。
それでも getBody()->write() できているということは、新しいオブジェクトを生成しているということ?

イミュータブル?

インスタンスを作成後は「変更不可」であることを示します。

array

先ほど出てきたルーティングプレースホルダーの内容が格納されます。

その他の使い方

通常は $app->get()$app->post() を使用しますが、他にも

  • どのメソッドでも反応する $app->any()
  • いずれかに反応する $app->map(['GET', 'POST'])
  • ベースとなるパスを設定する $app->setBasePath()
  • グループで指定できる $app->group()

なども使えるようです。

おわりに

ひとまず、ルーティング登録までを実験することができました。
次回以降、ビューを絡ませていきます。