Symfony:使用ParamFetcher验证电子邮件参数

时间:2017-10-09 15:09:01

标签: php symfony

逗人,

我想直接在RequestParam中验证电子邮件。 我使用这种REGEX:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

但是解析器无法在需求选项

中加载正则表达式
The parameter \"&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$\" must be defined.

我如何验证类似的电子邮件:

/**
 * @Rest\Patch(
 *     "v1/customer/update",
 *     name="Update a customer"
 * )
 * @RequestParam(
 *     name="email",
 *     requirements="email",
 *     description="The email of the user",
 *     strict=true
 *     )
 */

提前致谢

1 个答案:

答案 0 :(得分:0)

我获得了一项服务,可以将参数转换为Value对象,并在创建时对其进行验证。我发现这允许比RequestParam验证中给出的更多控制。

# In the same way a string is converted to a Entity, we can convert to a Vo\Username
username_converter:
    class: Ca\Api\Request\ParamConverter\UsernameConverter
    tags:
        - { name: request.param_converter, priority: -2, converter: username_converter }

example和内置UsernameConverter之后创建DoctrineParamConverter类非常简单,但是将值放入一个也被检查的对象中,它更容易,因为不需要数据库访问。

如果值对象构造函数验证失败,就像这样(这将是一封电子邮件):

if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
    throw new \InvalidArgumentException(sprintf('"%s" is not a valid email', $address));
}

然后框架捕获了异常。