基本

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

$app = new SilexApplication();

...

$app->run();

SilexApplicationクラスのインスタンスを作成し、そのインスタンスで 挙動を設定し、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。

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

<?php

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

use SymfonyComponentHttpFoundationResponse;

...

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

パラメータ

GETやPOSTのパラメータは、SymfonyComponentHttpFoundationRequestのインスタンスを用いて取得する。

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

use SymfonyComponentHttpFoundationRequest;

...

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

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

    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+);

リダイレクト

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

$app->get(/sample02-08, function (SilexApplication $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;
});

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

JSON

JSONはSilexApplicationjsonメソッドを使用する。

$app->get(/sample02-09, function (SilexApplication $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エスケープはSilexApplicationescapeメソッドを使用する。

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

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

参考

  • Usage - Documentation - Silex - The PHP micro-framework based on Symfony2 Components
  • Pimple - A simple PHP Dependency Injection Container
  • Services - Documentation - Silex - The PHP micro-framework based on Symfony2 Components

関連

  • Silexを試してみた(1) - きっかけとインストール - 作業ノート
  • Silexを試してみた(2) - 基本的なこと - 作業ノート
  • Silexを試してみた(3) - URLを生成する - 作業ノート
  • Silexを試してみた(4) - Twig - 作業ノート
  • Silexを試してみた(5) - Logging - 作業ノート
  • Silexを試してみた(6) - Doctrine DBAL - 作業ノート
  • Silexを試してみた(7) - その他と雑感 - 作業ノート