我有一个像这样定义的动作
/**
* @Route("/doSomething/{someId}", name="do_something")
* @Method("GET")
* @ParamConverter("someId", class="MyBundle:Something")
*/
public function someAction(Something $something) {
...
}
我想使用一个令牌参数,作为"普通"查询字符串参数,例如:
/myController/doSomething/5?token=2a47c2ff18a5d53cbaa5840b6c7c4008
需要使用此参数并为其设置一些要求的正确方法是什么,例如 - 匹配^[\da-z]+$
?有没有办法在注释语法中指定它?
我看到的一种方法是手动完成,例如:
public function someAction(Something $something, Request $request) {
$token = $request->query->get('token');
$regexConstrain = new Regex('^[\da-z]+$');
$regexConstrain->message = 'Invalid token';
$errors = $this->get('validator')->validate($token, $regexConstrain);
if (count($errors)) {
throw new \InvalidArgumentException($errors[0]->getMessage());
}
...
}
但是有更快的内置方法吗?
答案 0 :(得分:2)
如果这种方式更快,我不知道是否有更好的方法,但OptionsResolver可以使用值验证来处理这种情况。
如this french article中所定义,您可以使用OptionResolver验证查询参数。
use Symfony\Component\OptionsResolver\OptionsResolver;
public function someAction(Something $something, Request $request)
{
$resolver = new OptionsResolver();
$resolver->setAllowedValues('token', function ($value) {
return (bool) preg_match('/^[\da-z]+$/', $value);
});
// will throw a `Symfony\Component\OptionsResolver\Exception\InvalidArgumentException`
// if token doesn't match the regex
$resolver->resolve($request->query->all());
...
}