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\Application
のredirect
メソッドを使用する。
$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\Application
のjson
メソッドを使用する。
$app->get('/sample02-09', function (Silex\Application $app) {
$data = array(
'foo' => 'foo',
'bar' => 100,
);
return $app->json($data);
});
このときのContent-Type
はapplication/json
になる。
httpステータスを変えたいときは、json
の第2引数に該当するコードを指定する。
return $app->json($data, 404);
HTML Escaping
HTMLエスケープはSilex\Application
のescape
メソッドを使用する。
$app->get('/sample02-10', function (Silex\Application $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