Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

PHPのSlim3のリクエストオブジェクト・URLルーティング書き方まとめ

目次

Slim3_PHP Advent Calendar 2018
こちらから順番に追えます。

Slim3でのリクエスト振り分け方法

Slim3では基本的にpublicディレクトリのindex.phpでリクエストの振り分け(分岐)処理を行います。
では実際にどのような書き方があるか例を出していきます。

公式HPのトップのサンプルの場合

公式HPのトップページのサンプルは以下の通り
※コメントで補足を追加しています

//前略

/**
 * GETメソッドのみ、他のメソッドでは弾く
 * {プロトコル}://{トップドメイン}/hello/{適当な文字(/とか?、#等を除く)1字以上}でマッチ
 */
$app->get('/hello/{name}', function (Request $request, Response $response, array $args) {
    //マッチした場合の処理を記述
    $name = $args['name'];
    $response->getBody()->write("Hello, $name");

    //最後に絶対レスポンス部をreturnするようにする
    return $response;
});

//以下略

試しに、前回作ったHelloWorldの処理を少し変更してみましょう。
getをpostに変えるだけですが。

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

//composerで追加したパッケージを一括でインポートしてくれる
require __DIR__. "/../vendor/autoload.php";

//インスタンス作成
$app = new \Slim\App;

//getをpostに変える
$app->post('/{name}', function ($request, $response, $args) {
    $name = isset($args['name']) ? $args['name'] : "World" ;
    $response->getBody()->write("Hello{$name}");

    return $response;
});

$app->run();

image.png

しっかりと「このページはpostでしか受け付けてないのに、何でgetでアクセスしようとしているんだよ」と起こってくれました(ステータスコードも405になっています)。

Slim3で対応しているリクエストメソッド

公式HPドキュメント - リクエストについてのページ

Slim3では以下のHTTPリクエストメソッドに対応しています。

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD
  • PATCH
  • OPTIONS
  • ※全てのリクエストメソッドにマッチするANYというのもある

前項のサンプルでgetをpostに変えた様にdeleteメソッドやputメソッドにすることも可能です。
※formのaction属性ではgetとpostしか選択できないので、他のメソッドを使うことはあまりないかと思いますが……

複数のリクエストに対応する方法

例えば、getとpostメソッド両方に対応したい場合はmapを利用し、以下のように記述します。
どのメソッドなのかの判定は2種類用意されています。

$app->map(['get', 'post'], '/{name}', function ($request, $response, $args) {
    //getとpost両方にマッチさせつつ、それぞれ別の処理(分岐)をさせたい場合1
    if($request->getMethod() == 'GET'){
        //GETの場合
    }else{
        //POSTの場合
    }

    //getとpost両方にマッチさせつつ、それぞれ別の処理(分岐)をさせたい場合2
    var_export($request->isGet()); //getメソッドならtrueになる
    var_export($request->isPost()); //postメソッドならtrueになる
});

もちろん、isGetisPost以外にも対応しています。

  • $request->isGet()
  • $request->isPost()
  • $request->isPut()
  • $request->isDelete()
  • $request->isHead()
  • $request->isPatch()
  • $request->isOptions()

全てのリクエストメソッドに対応する方法

$app->any('/{name}', function ($request, $response, $args) {
    //処理とreturn
});

Slim3でののルーティングの書き方

公式HPドキュメント - ルーティングについてのページ

[]オプション

[]に囲まれている箇所はあってもなくてもマッチするようにします。

$app->post('/hoge[/{name}]', function ($request, $response, $args) {
    //処理とreturn
})

ネストにも対応しています。

$app->post('/[hoge[/{name}]]', function ($request, $response, $args) {
    //処理とreturn
})

正規表現にも対応しています。

$app->get('/hoge/{id:[0-9]+}', function ($request, $response, $args) {
    //処理とreturn
});

終わりの言葉

ここまでわかればだいぶWebアプリケーションをスムーズに作れるのではないでしょうか。
phpの標準で搭載されているjson_encode()関数でapiを作ったりとか。

ただ、Slim3にもapi(json)を返すメソッドはあるので、それは次回以降にサンプルを交えて紹介していこうと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?