我正在使用FOSRestBundle,并且想知道是否可以使用注释验证空查询参数?
例如,在调用:/comments/1
时会抛出异常,因为尚未设置dealId
和source
个查询参数。
然而,即使/comments/1?dealId=1&source=
值没有设置并且与注释中列出的正则表达式不匹配,调用source
也没问题。
控制器功能:
/**
* Get a single comment.
*
* @Annotations\QueryParam(name="dealId", requirements="\d+", strict=true, description="The deal the comments belong to.")
* @Annotations\QueryParam(name="source", requirements="(forum|blog)", strict=true, description="The source of the comments.")
*
* @Annotations\View()
*
* @Annotations\Get("/comments/{id}", requirements={"id" = "\d+"})
*
*/
public function getCommentAction(Request $request, ParamFetcherInterface $paramFetcher, $id)
{
$dealId = $paramFetcher->get('dealId');
$source = $paramFetcher->get('source');
// TODO: Implement
return [ 'id' => $id, 'dealId' => $dealId, 'source' => $source ];
}
更新
我也在FOSRestBundle的GitHub回购中提出了这个问题,由于正在使用的正则表达式验证器的限制,看起来我目前无法提出要求。
https://github.com/FriendsOfSymfony/FOSRestBundle/issues/814#issuecomment-49696288
答案 0 :(得分:2)
只需使用QueryParam的allowBlank
选项即可。在您的情况下,您可以将allowBlank设置为false
以获得预期的行为:
在FOSRestBundle中,allowBlank选项不是YET,但是我为FOSRestBundle提供了一个补丁,它很有可能在下一个版本中登陆,版本1.5.0 的
这就是您的控制器的样子:
/**
* Get a single comment.
*
* @Annotations\QueryParam(name="dealId", requirements="\d+", strict=true, description="The deal the comments belong to.")
* @Annotations\QueryParam(name="source", requirements="(forum|blog)", strict=true, allowBlank=false, description="The source of the comments.")
*
* @Annotations\View()
*
* @Annotations\Get("/comments/{id}", requirements={"id" = "\d+"})
*
*/
public function getCommentAction(Request $request, ParamFetcherInterface $paramFetcher, $id)
{
$dealId = $paramFetcher->get('dealId');
$source = $paramFetcher->get('source');
}
答案 1 :(得分:2)
如果要强制检查参数,可以按照文档中的说明更改配置文件,以下是示例:
fos_rest:
param_fetcher_listener: force
然后你可以设置其他选项,如strict,nullable。
在此处查看更多详情:
http://symfony.com/doc/current/bundles/FOSRestBundle/configuration-reference.html
答案 2 :(得分:1)
@Annotations \ QueryParam期望在使用nullable
参数时设置strict
参数(true或false)。尝试设置它。
我想你想要:
@Annotations\QueryParam(name="dealId", requirements="\d+", strict=true, nullable=false, description="The deal the comments belong to.")
@Annotations\QueryParam(name="source", requirements="(forum|blog)", strict=true, nullable=false, description="The source of the comments.")
另请阅读docs中有关QueryParam的更多信息。
答案 3 :(得分:1)
棘手的部分是允许source
和dealId
为空但我认为可能是
将这些参数添加到您的路由(因此必须指定它们才能访问控制器)并为每个参数使用字符串前缀(即dealid_
和source_
),这样就可以指定一个空值
您还需要修改正则表达式要求以允许空值。
/**
* Get a single comment.
*
* @Annotations\View()
* @Annotations\Get("/comments/{id}/dealid_{dealId}/source_{source}",
* requirements={"id" = "\d+", "dealId" = "\d*", "source" = "(forum|blog)*"})
*/
public function getCommentAction(Request $request,
ParamFetcherInterface $paramFetcher, $id, $dealId, $source)
{
return [ 'id' => $id, 'dealId' => $dealId, 'source' => $source ];
}
答案 4 :(得分:-3)
我不熟悉symfony,但我认为这很简单
$dealId = isset($dealId) ? $dealId : '';
会帮助您解决问题