Symfony2 检查数据库上的路由


Symfony2 Check Route on Db

一个关于Symfony2和路由的问题。

在我的路由文件中,我有以下路由:

offers_category:
    pattern: /offers/{category}
    defaults: { _controller: MyBundle:Offers:category}

通过这种方式,我可以调用任何 url,所有 url 都会以 200(HTTP 代码)响应。类别列表是动态的,由管理面板(使用Sonata创建)插入并保存在数据库中。

我想检查"类别"是否存在,然后用 200 或 404 回复。有一种方法可以告诉 Symfony2(在路由文件中)可用于占位符的字典?

我认为我必须在控制器内部检查在数据库上调用查询,但我希望找到更好或干净的解决方案。

谢谢大家


我找到了解决方案!

感谢@lenybernard对他的职位的宝贵建议。

使用@lenybernard解决方案,我能够使用索引字段配置路由,例如:

www.sitename.com/offers/1

但我需要一个网址,例如:

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,但直接在路由文件中无事可做(此外这不是它的角色),你是对的,这是控制器端:

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)
    {
        ...
    }
}

如文档中所述,引擎盖下发生了几件事:

转换器尝试从 请求属性(请求属性来自路由占位符 -- 这里 id);如果未找到类别对象,则生成 404 响应;如果找到类别对象,则定义新的类别请求属性 (可通过$request->属性->get('category')访问);至于其他 请求属性,自动注入控制器 当存在于方法签名中时。如果使用类型提示,如 上面的例子,你甚至可以省略@ParamConverter注释 完全因为它是自动的:

所以你只需要转换变量,参数转换器会自动抛出一个 404,很酷吧?

use My'Bundle'MyBundle'Entity'Offers'Category;
class OffersController
{
    /**
     * @param Category $category
     */
    public function showAction(Category $category)
    {
        ...
    }
}