27
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FastRoute を試す

Last updated at Posted at 2015-03-20

PHP のコア開発者の Nikita さんが開発しており、Slim 3 に採用されている FastRoute を試してみました。ご本人の書いた解説記事によると、Pux という C 言語で書かれた PHP エクステンションよりも速いとのことです。

Composer

composer.json の内容は次のとおりです。0.4 系では PHP 5.4.0 が最小要件になっています。

{
    "require": {
        "nikic/fast-route": "0.4.*"
    }
}

composer.json のあるディレクトリで次のコマンドを実行します。

composer install

.htaccess

Silex のサーバー設定マニュアルのコードを利用させてもらいます。

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
</IfModule>

コード

http://localhost/myapp/ に設置することを前提とします。

require 'vendor/autoload.php';

$base = '/myapp/';
$handlers = function(FastRoute\RouteCollector $r) use($base) {
    $r->addRoute('GET', $base, 'index');
    $r->addRoute('GET', $base.'about', 'about');
    $r->addRoute('GET', $base.'user/{name}', 'user');
    $r->addRoute('POST', $base.'api/charge', 'charge');
};

// $dispatcher = FastRoute\simpleDispatcher($handlers);

$dispatcher = FastRoute\cachedDispatcher($handlers, [
    'cacheFile' => __DIR__ . '/route.cache',
    'cacheDisabled' => true
]);

$uri = $_SERVER['REQUEST_URI'];
$method = $_SERVER['REQUEST_METHOD'];
$routeInfo = $dispatcher->dispatch($method, $uri);

switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        echo "ページが見つかりませんでした。\n";
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        echo "許可されない HTTP リクエストです。\n";
        break;
    case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        echo $handler($vars);
        break;
}

function index($vars)
{
    return "トップページです。\n";
}

function about($vars)
{
    return "このサイトに関するページです。\n";
}

function user($vars)
{
    return "{$vars['name']} さん、こんにちは。\n";
}

function charge($vars)
{
   if (!isset($_POST['amount'])) {
       return "金額が入力されていません。\n";
   }
   if (500 > $_POST['amount']) {
       return "寄付金は500円以上からお願いします。\n";
   }

   return "寄付していただきありがとうございました。\n";
}

ページの表示の確認

curl で HTTP リクエストを送信してみましょう。まずは GET リクエスト対応のトップページからです。

curl http://localhost/myapp/

次は POST リクエストのページです。

curl http://localhost/myapp/api/charge -F amount=500
27
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?