扩展操作参数解决

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

扩展操作参数解决

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

内置值解析器

欧宝娱乐app下载地址Symfony附带以下值的解析器HttpKernel组件:

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

此外,一些组件和官方包提供其他值解析器:

UserValueResolver
注入的对象是当前登录用户如果type-hinted用户界面。可以设置为默认值如果控制器可以通过匿名用户访问。它需要安装SecurityBundle
Psr7ServerRequestResolver
注入PSR-7如果type-hinted兼容版本的当前请求RequestInterface,MessageInterfaceServerRequestInterface。它需要安装SensioFrameworkExtraBundle

添加一个自定义值解析器

在下一个示例中,您将创建一个值解析器注入的对象代表当前用户只要控制器类型提示一个论点的方法用户类:

1 2 3 4 5 6 7 8 9 10 11 12 13
/ / src /控制器/ UserController.php名称空间应用程序\控制器;使用应用程序\实体\用户;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;用户控件{公共函数指数(用户美元用户){返回响应(“你好”美元用户- >getUserIdentifier ()。“!”);}}

注意,这个功能已经提供的@ParamConverter从SensioFrameworkExtraBundle注释。如果你有包安装在您的项目中,添加这个配置禁用type-hinted方法的自动转换参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ sensio_framework_extra.yamlsensio_framework_extra:要求:转换器:真正的auto_convert:

添加一个新值解析器需要创建一个实现类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
/ / src / ArgumentResolver / UserValueResolver.php名称空间应用程序\ArgumentResolver;使用应用程序\实体\用户;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpKernel\控制器\ArgumentValueResolverInterface;使用欧宝娱乐app下载地址\组件\HttpKernel\ControllerMetadata\ArgumentMetadata;使用欧宝娱乐app下载地址\组件\安全\核心\安全;UserValueResolver实现了ArgumentValueResolverInterface{私人美元安全;公共函数__construct(安全美元安全){美元- >安全=美元安全;}公共函数支持(请求美元请求,ArgumentMetadata美元论点):bool{如果(用户::类! = =美元论点- >方法()){返回;}返回美元- >安全- >getUser ()运算符用户;}公共函数解决(请求美元请求,ArgumentMetadata美元论点):iterable{收益率美元- >安全- >getUser ();}}

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

  • 一个参数必须type-hinted用户在你的操作方法签名;
  • 该值必须的一个实例用户类。

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

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

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

而添加优先级是可选的,建议添加一个确保注入期望值。内置的RequestAttributeValueResolver获取属性请求的优先级One hundred.。如果您的解析器也获取请求属性,设定优先级One hundred.或者更多。否则,设置优先级低于One hundred.确保参数解析器并不时触发请求属性存在(例如,当用户在子请求,通过)。

提示

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

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

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode