痛風とシステム障害を恐れるエンジニアのブログ

趣味のことだったり仕事に関することだったりを徒然なるままに。webとかオープン系の会社で働いてます。お仕事の依頼お待ちしておりまーす。

Klein.phpでお手軽にRESTFullなAPIを作ってみたお話し

いいわけ

最近ずっとブログの更新が滞っておりましたが、柄にもなく仕事を頑張ってしまったがゆえに、こちらの更新が止まってました・・・。 半年以上ほったらかしてた💦

ちなみに痛風については未だ発症しておりません。 これからも気をつけていきたいと思います。

そんなわけで今回は珍しくPHPネタです(`・ω・´)

Klein.phpとは・・・

GitHub - klein/klein.php: A fast & flexible router

そもそもこれ、なんて読むのかしら(笑)
クライン・・?
まぁ読み方はどうでもよくて(ヲイ)、何をするものかというとルーティングの設定をするライブラリですね。
sinatraというのにインスパイアしてるんですって(そっちもよく知らん)
Sinatra

昨今Laravelだとかそのへんの有名所のフレームワークを使えばルーティングの機能なんて普通についてきますよね。
ですが、あれらはちょっと機能がてんこ盛りすぎて今回の私には不要すぎたのです。

DBの接続もしない、ユーザからの入力値もない、セッションもいらない、とにかくAPIだけありゃええ、という状況です。
「どういう状況だよ」
ってツッコミがあるかもしれないけど、あまり業務をさらけ出すわけにもいかないので、そういう状況があったとだけ理解して頂けると・・・。

インストール

さてインストールですが簡単です。 composerでさくっと入ります。

php composer.phar require klein/klein

そして必要なファイルのインクルードの設定です。

require_once __DIR__ . '/vendor/autoload.php';

これだけ。
簡単ですなぁ。

簡単にルーティングの設定をやってみます

require_once __DIR__ . '/vendor/autoload.php';
$klein = new \Klein\Klein();

$klein->respond('GET', '/hello-world', function () {
    return 'Hello World!';
});

$klein->dispatch(); // <== これ重要

こんな感じです。パット見てわかりやすい記述方法ですよね(だから今回採用しました)。
メソッドとそれに対する処理を設定してあげれば終わりです。
簡単ですなぁ(2回目)

URIに指定されるものがある程度決まっているなら下のようなき方が出来ます。
楽ちん。

// /hoge1/hello-worldはアクセスできる
// /hoge2/hello-worldはアクセスできる
// /hoge3/hello-worldはアクセスできる
// /hoge4/hello-worldは404を返す
$klein->respond('GET', '/[hoge1|hoge2|hoge3]/hello-world', function () {
    return 'Hello World!';
});

上記の例では無名関数を渡していますが私はなんとなく関数でやりたくなったのでとりあえず

$handler = new MyHandler();
$klein->respond('GET', '/hello-world',[$handler,hello]);

といった形にしてMyHanlderクラスのhelloメソッドに処理をゴリゴリ書くようにしました。

ちなみにAPIの返却値はJSON形式にしております。
jsonで返す処理もKleinに用意されてます。
ハンドラクラスの実装はこんな感じでです。

public function hello(\Klein\Request $request, \Klein\Response $response){
  $var = "hello world";
  return $response->json($var);
}

と簡単にJOSNレスポンスを返却することができます。

URIから動的にパラメータを取得することも簡単にできます。

// [i:count] でパラメータの属性:名称を指定しています。
$klein->respond('GET', '/hello-world/[i:count]',[$handler,hello]);
:
:
public function hello(\Klein\Request $request, \Klein\Response $response){
  // $requestからパラメータを取得します.
  $count = $request->count; // [i:count]で設定した名称で取得できます.

  $var = "{$count}回もhello world 言わせないで";
  return $response->json($var);
}

と言った感じですね。
ちなみに他にはこんな感じで用意されてます。

*                    // Match all request URIs
[i]                  // Match an integer
[i:id]               // Match an integer as 'id'
[a:action]           // Match alphanumeric characters as 'action'
[h:key]              // Match hexadecimal characters as 'key'
[:action]            // Match anything up to the next / or end of the URI as 'action'
[create|edit:action] // Match either 'create' or 'edit' as 'action'
[*]                  // Catch all (lazy)
[*:trailing]         // Catch all as 'trailing' (lazy)
[**:trailing]        // Catch all (possessive - will match the rest of the URI)
.[:format]?          // Match an optional parameter 'format' - a / or . before the block is also optional

私の場合、いくら簡単なAPIとはいいつつもちょっとは認証処理くらいは入れてます。
リクエストHeaderに認証に必要なパラメータを設定しているのですが、それらも簡単に取得できます。

 public function hello(\Klein\Request $request, \Klein\Response $response){
   $headers = $request->headers();
   $token = $headers->get('{tokenの名称}');
   // ここでtokenの妥当性のチェック

といった具合にAPIを作成するのに必要な機能は一通り揃っています。
ほかにもルーティングのnamespaceとか便利な機能が揃っているので詳しくは公式サイトをご確認ください。

そんなこんなでKleinのご紹介でござんしたー。