サーチ…
前書き
Symfonyのコントローラは、HTTPリクエストを受け取り、HTTPレスポンスを返すPHP呼び出し可能関数(関数、オブジェクトのメソッド、またはクロージャ)です。 HTTPレスポンスには、HTMLページ、JSON文字列、ファイルのダウンロードなど、何でも含めることができます。
構文
- $ this-> generateUrl( 'route_name'、['プレースホルダ' => '値']); //プレースホルダを
route_name
してroute_name
URLを生成します - $ this-> render( 'template.html.twig'); // Twigテンプレートをレンダリングし、Responseオブジェクトを返します
- $ this-> render( 'template.html.twig'、['parameter' => $ value]); //パラメータ付きのTwigテンプレートをレンダリングする
- $ this-> createNotFoundException( 'Message');をスローします。 // NotFoundHttpExceptionをスローし、Symfonyが404応答を返すようにする
備考
コントローラは小さく、HTTPリクエストの処理に重点を置くべきです。アプリケーションの実際のビジネスロジックは、アプリケーションのさまざまな部分(たとえば、ドメインモデル)に委任される必要があります。
シンプルなコントローラクラス
// src/AppBundle/Controller/HelloWorldController.php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloWorldController
{
public function helloWorldAction()
{
return new Response(
'<html><body>Hello World!</body></html>'
);
}
}
Twigテンプレートのレンダリング
ほとんどの場合、コントローラのHTMLをハードコードする代わりに、テンプレートからHTMLレスポンスをレンダリングする必要があります。また、テンプレートは静的ではなく、アプリケーションデータのプレースホルダを含みます。デフォルトでは、強力なテンプレート言語であるTwigがSymfonyに付属しています。
あなたのコントローラーでTwigを使用するには、Symfonyの基本Controller
クラスを拡張します:
// src/AppBundle/Controller/HelloWorldController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloWorldController extends Controller
{
public function helloWorldAction()
{
$text = 'Hello World!';
return $this->render('hello-world.html.twig', ['text' => $text]);
}
}
Twigテンプレートを作成します( app/Resources/views/hello-world.html.twig
):
<html><body>{{ text }}</body></html>
Twigは自動的に{{ text }}
プレースホルダーをコントローラーが渡すtext
パラメーターの値に置き換えます。これにより、次のHTML出力がレンダリングされます。
<html><body>Hello World!</body></html>
404(見つからなかった)ページを返す
リクエストされたリソースが存在しないため、404(Not Found)レスポンスを返すことがあります。 symfonyでは、 NotFoundHttpException
スローすることでそうすることができます。
Symfonyベースコントローラーは、例外を作成するcreateNotFoundException
メソッドを公開します:
public function indexAction()
{
// retrieve the object from database
$product = ...;
if (!$product) {
throw $this->createNotFoundException('The product does not exist');
}
// continue with the normal flow if no exception is thrown
return $this->render(...);
}
Requestオブジェクトからのデータの使用
Request
オブジェクトにアクセスする必要がある場合(たとえば、クエリパラメータを読み取る、HTTPヘッダーを読み取る、アップロードされたファイルを処理するなど)、タイプヒント引数を追加して、リクエスト引数をメソッド引数として受け取ることができます。
use Symfony\Component\HttpFoundation\Request;
public function indexAction(Request $request)
{
$queryParam = $request->query->get('param');
// ...
}
symfonyはタイプヒントを認識し、コントローラの呼び出しにリクエスト引数を追加します。