扩展动作参数解析

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.2,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

扩展动作参数解析

3.1

ArgumentResolver和值解析器是在Symfony 3.1中引入的。ob娱乐下载

控制器指南,你已经知道你可以得到请求对象通过控制器中的参数。参数必须输入提示请求这样才能被认可。这是通过ArgumentResolver.通过创建和注册自定义参数值解析器,可以扩展此功能。

HttpKernel附带的功能

ob娱乐下载Symfony在HttpKernel组件中附带了四个值解析器:

RequestAttributeValueResolver
尝试查找与参数名称匹配的请求属性。
RequestValueResolver
注入电流请求如果用请求或者一个类的扩展请求
DefaultValueResolver
如果参数是可选的,将设置参数的默认值。
VariadicValueResolver
验证请求数据是否为数组,并将它们全部添加到参数列表中。当动作被调用时,最后一个(可变的)参数将包含该数组的所有值。

请注意

在Symfony ob娱乐下载3.1之前,这个逻辑在ControllerResolver.旧的功能被重写为前面提到的值解析器。

添加自定义值解析器

添加新的值解析器需要创建一个类和一个服务定义。在下一个示例中,您将创建一个值解析器来注入用户对象从安全系统获取。假设你写了下面的控制器:

12 3 4 5 6 7 8 9 10 11 12
名称空间AppBundle控制器使用AppBundle实体用户使用ob娱乐下载组件HttpFoundation响应用户控件公共函数indexAction(用户用户返回响应(“你好”用户->getUsername()。“!”);}}

无论如何,你必须得到用户对象并将其注入到控制器中。可以通过实现ArgumentValueResolverInterface.这个接口指定你必须实现两个方法:

支持()
此方法用于检查值解析器是否支持给定的参数。解决()只在此返回时执行真正的
解决()
此方法将解析参数的实际值。一旦解析了该值,就必须收益率的值ArgumentResolver

这两种方法都得到请求对象,即当前请求,以及ArgumentMetadata实例。该对象包含从当前参数的方法签名检索到的所有信息。

现在知道了要做什么,就可以实现这个接口了。得到电流用户,则需要当前安全令牌。这个令牌可以从令牌存储中检索:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
/ / src / AppBundle / ArgumentResolver / UserValueResolver.php名称空间AppBundleArgumentResolver使用AppBundle实体用户使用ob娱乐下载组件HttpKernel控制器ArgumentValueResolverInterface使用ob娱乐下载组件安全核心身份验证令牌存储TokenStorageInterfaceUserValueResolver实现了ArgumentValueResolverInterface私人tokenStorage公共函数__construct(TokenStorageInterfacetokenStorage->tokenStorage =tokenStorage;}公共函数支持(请求请求, ArgumentMetadata论点如果(用户::类! = =论点->方法()){返回;}令牌->tokenStorage->getToken ();如果(!令牌运算符TokenInterface) {返回;}返回令牌->getUser ()运算符用户;}公共函数解决(请求请求, ArgumentMetadata论点收益率->tokenStorage->getToken ()->getUser ();}}

为了得到实际的用户对象,则给定的值必须满足以下要求:

  • 参数必须被类型提示为用户在你的行动方法签名;
  • 必须存在安全令牌;
  • 的实例用户

当所有这些要求都得到满足真正的返回,则ArgumentResolver调用解决()与它调用的值相同支持()

就是这样!现在您所要做的就是为服务容器添加配置。这可以通过将服务标记为controller.argument_value_resolver增加优先级。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
# app / config / services.yml服务:app.value_resolver.user:类:AppBundle \ ArgumentResolver \ UserValueResolver参数:-“@security.token_storage”标签:-名称:controller.argument_value_resolver,优先级:50

虽然添加优先级是可选的,但建议添加一个优先级以确保注入预期的值。的RequestAttributeValueResolver优先级为100。对象中获取属性请求,建议以较低的优先级触发自定义值解析器。这确保当属性出现时不会触发参数解析器。例如,当向用户传递子请求时。

提示

正如你所看到的UserValueResolver:支持()方法时,用户可能不可用(例如,当控制器不在防火墙后面时)。在这些情况下,解析器将不会被执行。如果没有解析实参值,则会引发异常。

为了防止这种情况,你可以在控制器中添加一个默认值。用户$ User = null).的DefaultValueResolver作为最后一个解析器执行,如果尚未解析任何值,则将使用默认值。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。