扩展动作参数解析

编辑本页

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

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

扩展动作参数解析

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

内置值解析器

ob娱乐下载中附带了以下值解析器HttpKernel组件

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

此外,一些官方包提供了其他的值解析器:

SecurityUserValueResolver
如果输入了暗示,则注入表示当前登录用户的对象用户界面.默认值为以防控制器被匿名用户访问。它需要安装SecurityBundle
Psr7ServerRequestResolver
注入PSR-7如果用类型提示,则当前请求的兼容版本RequestInterfaceMessageInterfaceServerRequestInterface.它需要安装SensioFrameworkExtraBundle

添加自定义值解析器

在接下来的示例中,您将创建一个值解析器,以便在控制器方法类型提示参数时注入表示当前用户的对象用户类:

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

方法已经提供了该特性@ParamConverter来自sensioframeworkextrabundance的注释。如果你在你的项目中安装了这个包,添加这个配置来禁用类型提示方法参数的自动转换:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / config.ymlsensio_framework_extra:要求:转换器:真正的auto_convert:

添加一个新的值解析器需要创建一个实现类ArgumentValueResolverInterface并为其定义服务。接口定义了两个方法:

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

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

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

12 3 4 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
/ / src / AppBundle / ArgumentResolver / UserValueResolver.php名称空间AppBundleArgumentResolver使用AppBundle实体用户使用ob娱乐下载组件HttpFoundation请求使用ob娱乐下载组件HttpKernel控制器ArgumentValueResolverInterface使用ob娱乐下载组件HttpKernelControllerMetadataArgumentMetadata使用ob娱乐下载组件安全核心安全UserValueResolver实现了ArgumentValueResolverInterface私人安全公共函数__construct(安全安全->安全=安全;}公共函数支持(请求请求, ArgumentMetadata论点如果(用户::类! = =论点->方法()){返回;}返回->安全->getUser ()运算符用户;}公共函数解决(请求请求, ArgumentMetadata论点收益率->安全->getUser ();}}

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

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

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

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

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / services.yml服务:AppBundle \ ArgumentResolver \ UserValueResolver:自动装配:真正的标签:-名称:controller.argument_value_resolver,优先级:50

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

提示

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

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

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