作業ノート

様々なまとめ、雑感など

Silexを試してみた(2) - 基本的なこと

基本

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

$app = new Silex\Application();

...

$app->run();

Silex\Applicationクラスのインスタンスを作成し、そのインスタンスで 挙動を設定し、runメソッドでリクエストの処理を行う。

インスタンスはPimpleを使用したDIコンテナであり、Silexでは必要なService Providerを事前に登録して 適宜利用したり、所定のパラメータを変更することでアプリケーションの挙動が変わる。

例えば、

$app['debug'] = true;

とすると、デバッグモードが有効になる。

リクエスト

HTTPメソッドと同名のメソッドでリクエストを受け付ける。 処理内容は匿名関数で定義する。

$app->get('/sample02-01', function() {
    return 'Hello1!';
});

$app->post('/sample02-02', function() {
    return 'Hello2!';
});

複数のメソッドを受け付けることができるmatchメソッドもある。

$app->match('/sample02-03', function() {
    return 'Hello3!';
})->method('GET|POST');

レスポンス

各メソッドでreturn文で文字列を返すと、それがレスポンスボディとなる。 このときのステータスコードは200。

内部的にはSymfony\Component\HttpFoundation\Responseのインスタンスを使用しており、 return文でこのインスタンスを返すことができる。こちらの場合は、ステータスコードが指定できる。

<?php

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

use Symfony\Component\HttpFoundation\Response;

...

$app->get('/sample02-04', function() {
    return new Response('Not Found', 404);
});

パラメータ

GETやPOSTのパラメータは、Symfony\Component\HttpFoundation\Requestのインスタンスを用いて取得する。

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

use Symfony\Component\HttpFoundation\Request;

...

$app->get('/sample02-05', function(Request $request) {
    $keys = $request->query->keys();

    $html = "<ul>\n";
    foreach ($keys as $key) {
        $html .= "<li>$key=".$request->get($key)."</li>\n";
    }
    $html .= "</ul>\n";

    return $html;
});

Routerのパターンマッチを使い、パスに埋め込んだ値を取得することができる。

$app->get('/sample02-06/{id}', function ($id) {
    $html = "id=$id";

    return $html;
});

また、assertメソッドを使って、パラメータの許容する値を限定することもできる。

$app->get('/sample02-07/{id}/{message}', function ($id, $message) {
    $html  = "id=$id<br/>";
    $html .= "message=$message";

    return $html;
})
->assert('id', '\d+');

リダイレクト

リダイレクトはSilex\Applicationredirectメソッドを使用する。

$app->get('/sample02-08', function (Silex\Application $app, Request $request) {
    $url = $request->getSchemeAndHttpHost().$request->getBasePath().'/sample02-08/redirected';
    return $app->redirect($url);
});

$app->get('/sample02-08/redirected', function () {
    return 'redirected from sample02-08';
});

このように匿名関数の引数にSilex\Applicationの変数を指定することで、関数内で参照できるようになる。

JSON

JSONはSilex\Applicationjsonメソッドを使用する。

$app->get('/sample02-09', function (Silex\Application $app) {

    $data = array(
        'foo' => 'foo',
        'bar' => 100,
    );

    return $app->json($data);
});

このときのContent-Typeapplication/jsonになる。

httpステータスを変えたいときは、jsonの第2引数に該当するコードを指定する。

return $app->json($data, 404);

HTML Escaping

HTMLエスケープはSilex\Applicationescapeメソッドを使用する。

$app->get('/sample02-10', function (Silex\Application $app) {
    return $app->escape('<script type="text/javascript">alert("alert!!");</script>');
});

なお、このメソッドはhtmlspecialchars関数のショートカットメソッド。

参考

関連