サーチ…
404応答を返す
サーバ上でリソースが見つからなかった場合、404のレスポンスが返されますNotFoundHttpException
では、このステータスは、 NotFoundHttpException
例外をスローすることによって生成されます。コントローラ内の余分なuse
文を避けるには、 Controller
クラスが提供するcreateNotFoundException()
使用しController
<?php
namespace Bundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class TestController extends Controller
{
/**
* @Route("/{id}", name="test")
* Recommended to avoid template() as it has a lot of background processing.
* Query database for 'test' record with 'id' using param converters.
*/
public function testAction(Test $test)
{
if (!$test) {
throw $this->createNotFoundException('Test record not found.');
}
return $this->render('::Test/test.html.twig', array('test' => $test));
}
}
複数のルート
Symfonyでは、1つのアクションに対して複数のルートを定義することができます。これは、同じ機能を持ちながら異なるパラメータを持つ関数を持つ場合に非常に役立ちます。
class TestController extends Controller
{
/**
* @Route("/test1/{id}", name="test")
* @Route("/test2/{id}", name="test2")
* Here you can define multiple routes with multiple names
*/
public function testAction(Test $test)
{
if (!$test) {
throw $this->createNotFoundException('Test record not found.');
}
return $this->render('::Test/test.html.twig', array('test' => $test));
}
}
POSTリクエストのリダイレクト
あなたがcontrollerActionにいるときPOSTメソッドとリクエストオブジェクトを維持しながら、別のルートにリダイレクトしたいPOSTリクエストが入ってきたら、次のコマンドを使用できます:
return $this->redirectToRoute('route', array(
'request' => $request,
), 307);
ここでコード307は要求メソッドを保存します。
サブドメインベースのルーティング
サブドメインベースのルーティングは、symfonyでhost
パラメータを使用して処理できます。たとえば、 _locale
パラメータをサブドメイン値として使用できます。
想定する
locale: en
domain: somedomain.com
パラメータはparameters.yml
configファイルで定義されていますが、routeは次のようになります:
/**
* @Route(
* "/",
* name="homepage",
* host="{_locale}.{domain}",
* defaults={"_locale" = "%locale%", "domain" = "%domain%"},
* requirements={"_locale" = "%locale%|de|fr", "domain" = "%domain%"}
* )
* @Route(
* "/",
* name="homepage_default",
* defaults={"_locale" = "%locale%"}
* )
*/
この時点から、ルータはhttp://de.somedomain.com
などのURIを処理できhttp://de.somedomain.com
。 2番目の@Route
アノテーションは、デフォルトのロケールとvoidサブドメインのフォールバックとして使用できます( http://somedomain.com
。
Routing.ymlを使ったsymfonyのルート
profile_user_profile:
path: /profile/{id}
defaults: { _controller: ProfileBundle:Profile:profile }
requirements:
id: \d+
methods: [get, delete]
注釈の代わりにRouting.ymlを使用することに決めた場合は、 すべてのルートをよりよく表示し、検索して見つけやすくなります。
Routing.ymlと注釈の間で選択するのはあなた次第です。両方を異なるルートに使用できますが、これは最善の解決策ではありません。
@Route()
アノテーションは次のようになります。
class ProfileController extends Controller
{
/**
* @Route("/profile/{id}", name="profile_user_profile", requirements={"id": "\d+"})
* @Method("GET", "DELETE")
*/
public function profileAction($id)
{
if (!$id) {
throw $this->createNotFoundException('User not found.');
}
return $this->render('::Profile/profile.html.twig', array('id' => $id));
}
}