扩展动作参数解析
编辑本页警告:您正在浏览的文档欧宝官网下载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名称空间AppBundle\ArgumentResolver;使用AppBundle\实体\用户;使用ob娱乐下载\组件\HttpKernel\控制器\ArgumentValueResolverInterface;使用ob娱乐下载\组件\安全\核心\身份验证\令牌\存储\TokenStorageInterface;类UserValueResolver实现了ArgumentValueResolverInterface{私人$tokenStorage;公共函数__construct(TokenStorageInterface$tokenStorage){$这->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
作为最后一个解析器执行,如果尚未解析任何值,则将使用默认值。