Symfony2 Проверка маршрута на БД

0

один вопрос о 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"}})
*/

... и все работает!

  • 0
    Если вы просто переименуете переменную {category} в {name}, она тоже будет работать без аннотации @ParamConverter и для заполнения параметра отображения: lighter, и мы с первого взгляда знаем, какой параметр нужно указать для маршрута (вместо категория, которая не указывает на обнаруженное свойство).
  • 0
    Здравствуй! Без аннотации @ParamConverter идентификатор работает не с меткой категории, а только с идентификатором категории. Поэтому, если я удаляю аннотацию @ParamConverter, работает только эти маршруты. www.sitename.com/offers/1 или www.sitename.com/offers/2 а @ParamConverter работает, эти маршруты www.sitename.com/offers/travel и www.sitename.com/offers/wellness . Может быть, что-то не так, но работает, могу ли я улучшить это каким-то образом? Спасибо
Теги:
routes

1 ответ

2
Лучший ответ

Существует простой и приятный способ 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)
    {
        ...
    }
}
  • 0
    Спасибо @lenybernard, я нашел решение, выше в моем посте вы можете найти мое решение. Благодарю. ;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню