根据需要设置参数,而无需在Symfony2中的路由中进行定义


Set a param as required without defining it in the route in Symfony2

我定义了一个类似的操作

/**
 * @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());
    }
    ...
}

但是,有没有一种更快、内置的方法可以做到这一点?

我不知道是否有更好的方法,也不知道这种方法是否会更快,但OptionsResolver可以使用值验证来处理这种情况。

正如这篇法语文章中所定义的,您可以使用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());
    ...
}