扩展操作参数解决
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.4,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.3(当前的稳定版本)。
扩展操作参数解决
在控制器指南,你知道你可以得到的请求在你的控制器对象通过一个参数。这个论点是type-hinted的请求
类为了得到认可。这是通过的ArgumentResolver。通过创建和注册自定义参数值解析器,您可以扩展此功能。
内置值解析器
欧宝娱乐app下载地址Symfony附带以下值的解析器HttpKernel组件:
- RequestAttributeValueResolver
- 试图找到一个匹配的请求属性的名称参数。
- RequestValueResolver
-
注入电流
请求
如果type-hinted请求
或一个类扩展请求
。 - ServiceValueResolver
- 注入服务如果type-hinted有效服务类或接口。这就像自动装配。
- SessionValueResolver
-
注入配置会话类扩展
SessionInterface
如果type-hintedSessionInterface
或一个类扩展SessionInterface
。 - DefaultValueResolver
- 将默认值的参数如果现在和参数是可选的。
- VariadicValueResolver
- 如果请求验证数据是一个数组,并将他们添加到参数列表。调用操作时,最后(可变)参数将包含所有这个数组的值。
此外,一些官方包提供其他值解析器:
- SecurityUserValueResolver
-
注入的对象是当前登录用户如果type-hinted
用户界面
。可以设置为默认值零
如果控制器可以通过匿名用户访问。它需要安装SecurityBundle。 -
Psr7ServerRequestResolver
-
注入PSR-7如果type-hinted兼容版本的当前请求
RequestInterface
,MessageInterface
或ServerRequestInterface
。它需要安装SensioFrameworkExtraBundle。
添加一个自定义值解析器
在下一个示例中,您将创建一个值解析器注入的对象代表当前用户只要控制器类型提示一个论点的方法用户
类:
1 2 3 4 5 6 7 8 9 10 11 12
名称空间AppBundle\控制器;使用AppBundle\实体\用户;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;类用户控件{公共函数indexAction(用户美元用户){返回新响应(“你好”。美元用户- >getUsername ()。“!”);}}
注意,这个功能已经提供的@ParamConverter从SensioFrameworkExtraBundle注释。如果你有包安装在您的项目中,添加这个配置禁用type-hinted方法的自动转换参数:
1 2 3 4 5
# app / config / config.ymlsensio_framework_extra:要求:转换器:真正的auto_convert:假
1 2 3 4 5 6 7 8 9 10 11 12 13 14
< !- - - - - -- - - - - -app/config/config.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns: sensio-framework-extra=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony_extra”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony_extra //www.oldmanjams.com/schema/dic/symfony_extra/symfony_extra-1.0.xsd”><sensio-framework-extra:配置><请求转换器=“真正的”auto-convert=“假”/ >< /sensio-framework-extra:配置>< /容器>
1 2 3 4 5 6 7
/ / app / config / config . php美元容器- >loadFromExtension (“sensio_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 / AppBundle / ArgumentResolver / UserValueResolver.php名称空间AppBundle\ArgumentResolver;使用AppBundle\实体\用户;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpKernel\控制器\ArgumentValueResolverInterface;使用欧宝娱乐app下载地址\组件\HttpKernel\ControllerMetadata\ArgumentMetadata;使用欧宝娱乐app下载地址\组件\安全\核心\安全;类UserValueResolver实现了ArgumentValueResolverInterface{私人美元安全;公共函数__construct(安全美元安全){美元这- >安全=美元安全;}公共函数支持(请求美元请求,ArgumentMetadata美元论点){如果(用户::类! = =美元论点- >方法()){返回假;}返回美元这- >安全- >getUser ()运算符用户;}公共函数解决(请求美元请求,ArgumentMetadata美元论点){收益率美元这- >安全- >getUser ();}}
为了得到实际的用户
对象在你的论点,给定的值必须满足以下要求:
- 一个参数必须type-hinted
用户
在你的操作方法签名; - 该值必须的一个实例
用户
类。
当所有这些需求得到满足真正的
返回,ArgumentResolver
调用解决()
与相同的价值观支持()
。
就是这样!现在你要做的就是添加服务容器的配置。这可以通过标签服务controller.argument_value_resolver
和添加一个优先级。
1 2 3 4 5 6
# app / config / services.yml服务:AppBundle \ ArgumentResolver \ UserValueResolver:自动装配:真正的标签:- - - - - -{名称:controller.argument_value_resolver,优先级:50}
1 2 3 4 5 6 7 8 9 10 11 12 13 14
< !- - - - - -- - - - - -app/config/services.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-Instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“AppBundle \ ArgumentResolver \ UserValueResolver”自动装配=“真正的”><标签的名字=“controller.argument_value_resolver”优先级=“50”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6
/ / app / config / services.php使用AppBundle\ArgumentResolver\UserValueResolver;美元容器- >自动装配(UserValueResolver::类)- >addTag (“controller.argument_value_resolver”,(“优先”= >50]);
而添加优先级是可选的,建议添加一个确保注入期望值。的RequestAttributeValueResolver
有一个100年的优先级。为这个负责获取属性请求
,推荐触发您的自定义解析器与一个较低的优先级值。这使得确定参数解析器并不时触发属性存在。例如,当沿着子请求,通过用户。
提示
正如你所看到的UserValueResolver:支持()
方法,用户可能不可用(例如,当控制器不是防火墙后面)。在这些情况下,解析器将不会被执行。如果没有解决,参数值就会抛出一个异常。
为了避免这种情况,你可以在控制器(如添加一个默认值。用户$ User =零
)。的DefaultValueResolver
执行最后一个解析器,将使用默认的值如果没有值已经解决。