一个关于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)
{
...
}
}