один вопрос о Symfony2 и маршрутах.
В моем файле маршрутизации у меня есть этот маршрут:
offers_category:
pattern: /offers/{category}
defaults: { _controller: MyBundle:Offers:category}
Таким образом, я могу вызвать любой url, и все они ответят 200 (HTTP CODE). Список категорий является динамическим, вставленным административной панелью (созданной с помощью Sonata) и сохраненной на db.
Я хотел бы проверить, существует ли "категория", а затем ответить на 200 или 404. Есть ли способ сообщить Symfony2 (в файле маршрута) словарь, доступный для заполнителя?
Я думаю, что мне нужно проверить внутри моего контроллера, вызывающего запрос на db, но я надеюсь найти лучшее или очищенное решение.
Спасибо всем
Благодаря @lenybernard за ценный совет на его посту.
С помощью решения @lenybernard я смог настроить маршрут с индексированным полем:
www.sitename.com/offers/1
но мне нужен был URL-адрес:
www.sitename.com/offers/travel
и для этого я использовал этот метод для сопоставления метки, не проиндексированной на URL:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use NameProject\MyBundle\Entity\Category;
/**
* @Route("/offers/{category}")
* @ParamConverter("type", class="NameProjectMyBundle:Category", options={"mapping": {"category": "name"}})
*/
... и все работает!
Существует простой и приятный способ ParamConverter, но ничего не нужно делать в файле маршрутизации (кроме того, это не его роль), и вы правы, это ControllerSide:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use My\Bundle\MyBundle\Entity\Offers\Category;
class OffersController
{
/**
* @param Category $category
* @ParamConverter("category", class="MyBundle:Offers/category")
*/
public function showAction(Category $category)
{
...
}
}
Как сказано в документации, некоторые вещи случаются под капотом:
Конвертер пытается получить объект MyBundle: Offers/category из атрибутов запроса (атрибуты запроса поступают из заполнителей маршрутов - здесь id); Если объект категории не найден, генерируется ответ 404; Если объект категории найден, определяется атрибут запроса новой категории (доступен через $request-> attributes-> get ('category')); Что касается других атрибутов запроса, он автоматически вводится в контроллер, если присутствует в сигнатуре метода. Если вы используете подсказку типа, как в приведенном выше примере, вы можете вообще аннотировать аннотацию @ParamConverter, потому что она автоматическая:
Таким образом, вам просто нужно наложить переменную, а преобразователь параметров будет автоматически вызывать 404, что-то здорово?
use My\Bundle\MyBundle\Entity\Offers\Category;
class OffersController
{
/**
* @param Category $category
*/
public function showAction(Category $category)
{
...
}
}
www.sitename.com/offers/1
илиwww.sitename.com/offers/2
а @ParamConverter работает, эти маршрутыwww.sitename.com/offers/travel
иwww.sitename.com/offers/wellness
. Может быть, что-то не так, но работает, могу ли я улучшить это каким-то образом? Спасибо