【问题标题】:Processing Query Strings?处理查询字符串?
【发布时间】:2013-07-01 11:41:02
【问题描述】:

使用 Symfony2、FOSRest 和 Doctrine 构建了一个 API。给定以下路线:

"GET /api/path/to/product"

还有以下参数:

[("vendorID", 10), ("destination", "tanzania"), ("type", "accommodation"), ("sort", "price", "ASC")]

使用 FOSRest 捆绑可以检索这些字符串,但是,将它们映射到原则查询是挑战出现的地方。

我考虑过使用为查询字符串的不同组合定制的大量 case 语句,这不是一个优雅的解决方案。想要构建一个不会严重影响性能的更通用的控制器。任何建议都会有所帮助。

【问题讨论】:

    标签: symfony doctrine-orm symfony-2.2 fosrestbundle symfony-2.3


    【解决方案1】:

    FOSRestBundle 有一个非常酷的param fetcher listener。使用它,您可以使用注释定义查询字符串参数,是否允许它们为空,设置默认值,定义要求。根据您的示例参数,我猜到了一些值

    /**
     * @QueryParam(name="vendorID", requirements="\d+", strict=true, description="vendor id")
     * @QueryParam(name="destination", nullable=true, description="restrict search to given destination")
     * @QueryParam(name="type", nullable=true, description="restrict search to given type")
     * @QueryParam(name="sort", requirements="(price|foo|bar)", default="price", description="sort search according to price, foo or bar")
     * @QueryParam(name="dir", requirements="(ASC|DESC)", default="ASC", description="sort search ascending or descending")
     */
     public function getProducts(ParamFetcher $paramFetcher)
     {
         $vendorID = $paramFetcher->get('vendorID');
         // and so on
     }
    

    对于构建查询构建器,使用具有默认值的参数非常简单,因为它们永远不会被未定义的值填充。对于严格的参数,这也没有问题,因为如果严格的参数丢失或不符合要求,它将引发400 Bad Request。只有使用可为空的参数,您才必须在将条件添加到查询构建器之前检查非空。

    顺便说一句。看看NelmioApiDocBundle,它会为每个用@ApiDoc 注释的动作生成一个很好的文档。它还解析参数获取器注释。非常方便。

    【讨论】:

    • 实例化查询带来了很好的问题,还是应该委托给产品存储库类?
    • 那一刻编辑了我的答案。您可以将它们全部传递给存储库函数,并且只有在可空参数上,您必须在向查询构建器添加条件之前检查非空值。
    • 非常感谢帕子。将实施并让您知道。再次感谢
    • 我相信你的意思是400 Bad Request
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2022-01-24
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多