こんにちわ!@mrtryです。 年末年始まであと1月、がんばっていきたいです...!
さて、「Symfony2入門」の5回目の記事です。 前回に引き続き、コントローラについてまとめます。
今回は、実際にコントローラを利用する際に基本となる
ルーティングパラメータとHTTPリクエストの利用方法
と、Responseオブジェクトの生成方法
を紹介します。
以下、今回の記事の目次になります。
- ルーティングパラメータの利用
- HTTPリクエストの情報を取得
- Responseオブジェクトを生成するメソッド
ルーティングパラメータの利用
ルーティングで設定したプレースホルダとdefaultsの値は、同じ変数名でコントローラの引数に定義すると、値をそのまま利用することができます。
以下の例では、
ルーティングで定義されている変数firstName
、lastName
、color
、_controller
のうち、firstName
、lastName
をコントローラの引数に用いています。
# app/config/routing.yml hello: path: /hello/{firstName}/{lastName} defaults: _controller: AcmeHelloBundle:Hello:index color: green
AcmeHelloBundle:Hello:index
public function indexAction($firstName, $lastName) { ... }
HTTPリクエストの情報を取得
HTTPリクエストの情報は、Requestオブジェクト
を利用すると簡単に取得することができます。
Symfony\Component\HttpFoundation\Request
をタイプヒントで指定し、引数を定義すると、Requestオブジェクトがフレームワークにより自動的に注入されます。
Requestオブジェクトには、スーパーグローバル変数に対応するプロパティが定義されています。
スーパーグローバル変数名 | 対応するプロパティ名 |
---|---|
$_POST | $request |
$_GET | $query |
$_SERVER | $server, $header |
$_FILES | $files |
$_COOKIE | $cookies |
また、ルーティングパラメータの値は、$attributes
というプロパティに格納されています。
各プロパティの値は、ParameterBagを通して取得します。
use Symfony\Component\HttpFoundation\Request; public function indexAction(Request $request) { // $_POST['hoge'] $request->request->get('hoge'); // $_GET['hoge'] $request->query->get('hoge'); // $_SERVER['DOCUMENT_ROOT'] $request->server->get('DOCUMENT_ROOT'); // $_SERVERのインデックスのうち、命名がHTTP_*に該当するもの // $_SERVER['HTTP_USER_AGENT'] $request->header->get('user-agent'); // $_FILES['hoge'] $request->files->get('hoge'); // $_COOKIE['hoge'] $request->cookies->get('hoge'); // ルーティングパラメータの取得 $request->attributes->get('_route'); $request->attributes->get('_controller'); // プレースホルダ、defaultsで定義した変数も取得できる $request->attributes->get('hoge'); $request->attributes->get('fuga'); }
Responseオブジェクトを生成するメソッド
コントローラは、最終的に、Responseオブジェクトを生成して返す役割があります。 Responseオブジェクトを生成するために用意されているメソッドを紹介します。
リダイレクト
別のページへリダイレクトさせる際は、redirectToRoute()、または、redirect()を利用します。
以下の例では、
ルート名:homepage
のページへリンクを作成し、redirectToRoute()
、redirect()
でリダイレクトを設定しています。
public function indexAction() { // このメソッドはSymfony 2.6以上だと利用できる // redirectToRoute()の引数は、ルート名 return $this->redirectToRoute('homepage'); // redirect()は、引数がURLなので、generateUrl()でURLを生成している return $this->redirect($this->generateUrl('homepage')); }
基本的に、redirectToRoute()
、redirect()
を利用した際のレスポンスコードは302
になりますが、
第2引数で、レスポンスコードを任意に指定することもできます。
public function indexAction() { // このメソッドはSymfony 2.6以上だと利用できる return $this->redirectToRoute('homepage', 301); return $this->redirect($this->generateUrl('homepage'), 301); }
フォワード
別のコントローラへフォワードする際は、forward()を利用します。
forward()
の戻り値は、呼び出したコントローラーが生成するResopnseオブジェクトになります。
以下の例では、indexAction()
の処理の過程で、AcmeHelloBundle:Hello:fancy
の処理したResponseオブジェクトを利用しています。
public function indexAction($name) { // AcmeHelloBundle:Hello:fancyのResponseオブジェクトが返ってくる $response = $this->forward('AcmeHelloBundle:Hello:fancy', [ 'name' => $name, 'color' => 'green', ]); // ... $responseをさらに加工するか、直接返す return $response; }
テンプレートのレンダリング
テンプレートをレンダリングし、HTMLを返すには、render()を利用します
以下の例では、AcmeHelloBundle:Hello:index.html.twig
というテンプレートをレンダリングし、HTMLとして返しています。
public function indexAction() { return $this->render( 'AcmeHelloBundle:Hello:index.html.twig', [ 'name' => $name ]); }
HTTPステータスコードの403、404を返す
HTTPプロトコルに沿ったHTTPステータスコードを返すメソッドとして、
createNotFoundException()と、createAccessDeniedException()が用意されています。
createNotFoundException()
は、404(Not Found)
、createAccessDeniedException()
は、403(Forbidden)
のHTTPステータスコードを持つ例外を返します。
public function indexAction() ... // 認証確認 if (!$isAuthorization) { throw $this->createAccessDeniedException('アクセスが禁止されています'); } ... // データベースからオブジェクトを取得する if (!$product) { throw $this->createNotFoundException('製品が存在しません'); } return $this->render(...); }
また、コントローラ内で例外が発生した時、
$response->header
にX-Status-Code
が値を持っているか、発生した例外がHttpExceptionInterface
を実装している場合、設定されているHTTPステータスコードの値を返します。
どちらも該当しない場合は、500
のHTTPステータスコードを返すようになっています。
おわりに
今回は、ルーティングパラメータとHTTPリクエストの利用方法
と、Responseオブジェクトの生成方法
についてまとめました。
次回は、SymfonyでORMとして利用されているDoctrine
についてまとめたいと思います。
また、この記事は、@mrtryの勉強の一環で書いています。 お気づきの点がありましたら、コメント等でご指摘いただければ幸いです!