Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2检查Db上的路由_Php_Symfony_Routes - Fatal编程技术网

Php Symfony2检查Db上的路由

Php Symfony2检查Db上的路由,php,symfony,routes,Php,Symfony,Routes,关于Symfony2和路线的一个问题 在我的路由文件中,我有以下路由: offers_category: pattern: /offers/{category} defaults: { _controller: MyBundle:Offers:category} 通过这种方式,我可以调用任何url,所有url都将以200(HTTP代码)响应。 类别列表是动态的,由管理面板(使用Sonata创建)插入并保存在db上 我想检查“类别”是否存在,然后用200或404回复。 有一种方法

关于Symfony2和路线的一个问题

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

offers_category:
    pattern: /offers/{category}
    defaults: { _controller: MyBundle:Offers:category}
通过这种方式,我可以调用任何url,所有url都将以200(HTTP代码)响应。 类别列表是动态的,由管理面板(使用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"}})
*/

…一切都会成功

有一个简单而好的方法叫做to do,但是在路由文件中没有直接的操作(而且这不是它的角色),您是对的,这是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注释 因为它是自动的:

所以你只要转换变量,param转换器就会自动抛出404,酷吧

use My\Bundle\MyBundle\Entity\Offers\Category;

class OffersController
{
    /**
     * @param Category $category
     */
    public function showAction(Category $category)
    {
        ...
    }
}

谢谢@lenybernard,我找到了解决方案,在我的帖子上面你可以找到我的解决方案。谢谢我只需将{category}变量重命名为{name},如果没有@ParamConverter注释和填充映射选项,它也会起作用:打火机,我们一眼就能知道路由的参数是什么(而不是不指示exptected属性的category)。嗨!如果没有@ParamConverter注释id,则该注释id不适用于类别标签,而仅适用于类别id。因此,如果我删除@ParamConverter注释,则仅适用于这些路由
www.sitename.com/offers/1
www.sitename.com/offers/2
,而@ParamConverter则适用于这些路由
www.sitename.com/offers/travel
www.sitename.com/offers/wellness
。也许有什么地方不对劲,但还是管用的,我能用某种方式改进它吗?谢谢