扩展操作参数解决

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.3,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

扩展操作参数解决

控制器指南,你知道你可以得到的请求在你的控制器对象通过一个参数。这个论点是type-hinted的请求类为了得到认可。这是通过的ArgumentResolver。通过创建和注册自定义参数值解析器,您可以扩展此功能。

HttpKernel附带的功能

3.3

SessionValueResolverServiceValueResolver在Symfony 3.3中都增加了。ob娱乐下载

ob娱乐下载Symfony附带五值解析器HttpKernel组件:

RequestAttributeValueResolver
试图找到一个匹配的请求属性的名称参数。
RequestValueResolver
注入电流请求如果type-hinted请求或一个类扩展请求
ServiceValueResolver
注入服务如果type-hinted有效服务类或接口。这就像自动装配
SessionValueResolver
注入配置会话类扩展SessionInterface如果type-hintedSessionInterface或一个类扩展SessionInterface
DefaultValueResolver
将默认值的参数如果现在和参数是可选的。
VariadicValueResolver
如果请求验证数据是一个数组,并将他们添加到参数列表。调用操作时,最后(可变)参数将包含所有这个数组的值。

请注意

Symfony 3ob娱乐下载.1之前,这个逻辑是在解决ControllerResolver。老功能重写上述值解析器。

添加一个自定义值解析器

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

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

你会得到用户对象并将它注入到控制器。这可以通过实现ArgumentValueResolverInterface。这个接口指定你必须实现两个方法:

支持()
这个方法是用来检查值解析器是否支持给定的参数。解决()时才会执行这个回报吗真正的
解决()
这种方法可以解决参数的实际值。一旦解决价值,你必须收益率的价值ArgumentResolver

这两种方法都得到了请求对象,这是当前请求,一个ArgumentMetadata实例。这个对象包含所有信息检索方法签名的当前参数。

现在你知道该怎么做,你可以实现这个接口。得到当前用户,你需要当前的安全令牌。这个令牌可以从令牌存储检索:

1 2 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 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 ();}}

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

  • 一个参数必须type-hinted用户在你的操作方法签名;
  • 安全令牌必须存在;
  • 该值必须的一个实例用户

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

就是这样!现在你要做的就是添加服务容器的配置。这可以通过标签服务controller.argument_value_resolver和添加一个优先级。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
# app / config / services.yml服务:_defaults:#……确保启用了自动装配自动装配:真正的#……AppBundle \ ArgumentResolver \ UserValueResolver:标签:- - - - - -{名称:controller.argument_value_resolver,优先级:50}

而添加优先级是可选的,建议添加一个确保注入期望值。的RequestAttributeValueResolver有一个100年的优先级。为这个负责获取属性请求,推荐触发您的自定义解析器与一个较低的优先级值。这使得确定参数解析器并不时触发属性存在。例如,当沿着subrequests传递用户。

提示

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

为了避免这种情况,你可以在控制器(如添加一个默认值。用户$ User =零)。的DefaultValueResolver执行最后一个解析器,将使用默认的值如果没有值已经解决。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。