Поиск…
Возвратите ответ 404
404 ответа возвращаются, когда ресурс не найден на сервере, в Symfony этот статус может быть создан путем NotFoundHttpException
исключения NotFoundHttpException
. Чтобы избежать use
инструкции дополнительного use
внутри контроллера, используйте 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 можно определить несколько маршрутов для одного действия. Это может быть очень полезно, если у вас есть функции, которые делают то же самое, но имеют разные параметры.
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
Когда вы находитесь в контроллереAction. И вы получаете запрос POST , но хотите перенаправить его на другой маршрут , сохраняя при этом метод POST и объект запроса , вы можете использовать следующее:
return $this->redirectToRoute('route', array(
'request' => $request,
), 307);
Код 307 здесь сохраняет метод запроса.
Подземная маршрутизация
Маршрутизация на основе субдомена может обрабатываться в Symfony с использованием параметра host
. Например, параметр _locale
может использоваться как значение поддомена.
Если предположить,
locale: en
domain: somedomain.com
параметры определяется в parameters.yml
конфигурационного файла, маршрут будет:
/**
* @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%"}
* )
*/
С этого момента маршрутизатор может обрабатывать URI, например http://de.somedomain.com
. Вторая аннотация @Route
может использоваться в качестве резервной @Route
для локали по умолчанию и void subdomain, http://somedomain.com
.
Маршруты Symfony с использованием Routing.yml
profile_user_profile:
path: /profile/{id}
defaults: { _controller: ProfileBundle:Profile:profile }
requirements:
id: \d+
methods: [get, delete]
Если вы решили использовать Routing.yml вместо аннотаций, вы можете получить лучший обзор всех маршрутов и проще найти и найти его.
Вы можете выбирать между Routing.yml и Annotations . Вы можете использовать оба для разных маршрутов, но это не лучшее решение.
@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));
}
}