关于Symfony2和路线的一个问题。
在我的路由文件中,我有这条路线:
offers_category:
pattern: /offers/{category}
defaults: { _controller: MyBundle:Offers:category}
通过这种方式,我可以调用任何URL,并且所有URL都将以200(HTTP CODE)响应。 类别列表是动态的,由管理面板(使用Sonata创建)插入并保存在db。
我想检查"类别"存在,然后用200或404作出回应。 有一种方法可以告诉Symfony2(在路由文件中)可用于占位符的字典吗?
我认为我必须检查我的控制器内部调用db的查询,但我希望找到更好或清理的解决方案。
全部谢谢
感谢@lenybernard在他的帖子上提供了宝贵的建议。
使用@lenybernard解决方案,我能够配置一个带索引字段的路由,如:
www.sitename.com/offers/1
但我需要一个网址:
www.sitename.com/offers/travel
为此,我使用此方法将未编入索引的标签映射到网址:
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 :(得分: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:商品/类别对象 请求属性(请求属性来自路径占位符 - 这里是id);如果未找到Category对象,则生成404响应;如果找到Category对象,则定义新的类别请求属性 (可通过$ request-> attributes-> get('category'))访问;至于其他 请求属性,它会自动注入控制器 当存在于方法签名中时。如果你使用类型提示 在上面的例子中,您甚至可以省略@ParamConverter注释 完全是因为它是自动的:
所以你只需要转换变量,param转换器会自动抛出404,很酷吗?
use My\Bundle\MyBundle\Entity\Offers\Category;
class OffersController
{
/**
* @param Category $category
*/
public function showAction(Category $category)
{
...
}
}