扩展操作参数解决
编辑该页面扩展操作参数解决
在控制器指南,你知道你可以得到的请求在你的控制器对象通过一个参数。这个论点是type-hinted的请求
类为了得到认可。这是通过的ArgumentResolver。通过创建和注册自定义值解析器,您可以扩展此功能。
内置值解析器
ob娱乐下载Symfony附带以下值的解析器HttpKernel组件:
- BackedEnumValueResolver
-
试图解决一个枚举支持从一个路由路径参数相匹配的参数的名称。导致404 Not Found反应如果该值不是一个有效的支持枚举类型的值。
例如,如果您的支持枚举是:
1 2 3 4 5 6 7 8 9
名称空间应用程序\模型;enum套装:字符串{情况下心=“H”;情况下钻石=' D ';情况下俱乐部=“C”;情况下黑桃=“年代”;}
和控制器包含以下:
1 2 3 4 5 6 7 8 9 10
类CardController{#(路线(/卡/{西装}))公共函数列表(套装美元西装):响应{/ /……}/ /……}
当请求
/卡/小时
网址,美元的衣服
变量将保存适合:心
的情况。此外,您可以限制路由参数的允许的值只有一个(或更多)
EnumRequirement
:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\组件\路由\要求\EnumRequirement;/ /……类CardController{#(路线(“/卡/{西装}”,要求:[/ /这允许枚举中定义的所有值“诉讼”= >新EnumRequirement(套装::类),/ /这限制了可能的值的枚举值列在这里“诉讼”= >新EnumRequirement([套装::钻石,适合::黑桃)))))公共函数列表(套装美元西装):响应{/ /……}/ /……}
上面的示例允许请求
/卡/ D
和/卡/ S
url并导致404 Not Found反应两个病例。6.1
的
BackedEnumValueResolver
和EnumRequirement
在Symfony 6.1中引入的。ob娱乐下载 - RequestAttributeValueResolver
- 试图找到一个匹配的请求属性的名称参数。
- DateTimeValueResolver
-
试图找到一个匹配的请求属性参数的名称和注入
DateTimeInterface
对象如果type-hinted类扩展DateTimeInterface
。默认情况下任何输入,可以解析PHP是一个日期字符串的接受。你可以限制如何格式化的输入MapDateTime属性。
6.1
的
DateTimeValueResolver
是在Symfony 6.1中引入的。ob娱乐下载 - RequestValueResolver
-
注入电流
请求
如果type-hinted请求
或一个类扩展请求
。 - ServiceValueResolver
- 注入服务如果type-hinted有效服务类或接口。这就像自动装配。
- SessionValueResolver
-
注入配置会话类实现
SessionInterface
如果type-hintedSessionInterface
或一个类实现SessionInterface
。 - DefaultValueResolver
- 将默认值的参数如果现在和参数是可选的。
- UidValueResolver
-
尝试任何UID值从一个路由路径参数转化为UID对象。导致404 Not Found反应如果该值不是一个有效的UID。
例如,下面会令牌参数转换成一个
UuidV4
对象:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;使用ob娱乐下载\组件\Uid\UuidV4;类DefaultController{#(路线(/分享/{牌}))公共函数分享(UuidV4美元令牌):响应{/ /……}}
6.1
的
UidValueResolver
是在Symfony 6.1中引入的。ob娱乐下载 - VariadicValueResolver
- 如果请求验证数据是一个数组,并将他们添加到参数列表。调用操作时,最后(可变)参数将包含所有这个数组的值。
此外,一些组件、桥梁和官方包提供其他值解析器:
- UserValueResolver
-
注入的对象是当前登录用户如果type-hinted
用户界面
。你也可以自己type-hint用户
但是你必须添加类# (CurrentUser)
属性参数。可以设置为默认值零
如果控制器可以通过匿名用户访问。它需要安装SecurityBundle。如果参数是不可以为空,没有登录用户或登录用户的用户类不匹配type-hinted类
AccessDeniedException
由解析器,以防止被访问控制器。 - EntityValueResolver
-
自动查询一个实体并将它作为参数传递给控制器。
例如,下面的查询
产品
实体已{id}
主键:1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由\注释\路线;类DefaultController{#(路线(/产品/ {id}))公共函数分享(产品美元产品):响应{/ /……}}
学习更多关于使用
EntityValueResolver
,请专门的部分自动抓取对象。6.2
的
EntityValueResolver
是在Symfony 6.2中引入的。ob娱乐下载 - PSR-7对象解析器:
-
注入一个Symfonob娱乐下载y HttpFoundation
请求
从PSR-7对象创建的对象类型ServerRequestInterface,RequestInterface或MessageInterface。它需要安装PSR-7桥组件。
添加一个自定义值解析器
在下一个示例中,您将创建一个值解析器注入一个ID值对象时控制器参数类型实现IdentifierInterface
(如。BookingId
):
1 2 3 4 5 6 7 8 9 10 11 12 13
/ / src /控制器/ BookingController.php名称空间应用程序\控制器;使用应用程序\预订\BookingId;使用ob娱乐下载\组件\HttpFoundation\响应;类BookingController{公共函数指数(BookingId美元id):响应{/ /……做一些与$ id}}
6.2
的ValueResolverInterface
是在Symfony 6.2中引入的。ob娱乐下载在6.2之前,您必须使用ArgumentValueResolverInterface,它定义了不同的方法。
添加一个新值解析器需要创建一个实现类ValueResolverInterface和定义一个服务。
这个接口包含一个解决()
每个参数的方法,该方法被称为控制器。它接收当前请求
对象和一个ArgumentMetadata实例,其中包含所有信息的方法签名。
的解决()
方法应该返回一个空数组(如果不能解决这个论点)或数组的值(s)解决。通常参数解析为单个值,但可变参数需要解决多个值。这就是为什么你必须始终返回一个数组,甚至为单一值:
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
/ / src / ValueResolver / IdentifierValueResolver.php名称空间应用程序\ValueResolver;使用应用程序\IdentifierInterface;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpKernel\控制器\ValueResolverInterface;使用ob娱乐下载\组件\HttpKernel\ControllerMetadata\ArgumentMetadata;类BookingIdValueResolver实现了ValueResolverInterface{公共函数解决(请求美元请求,ArgumentMetadata美元论点):数组{/ /获得参数类型(例如BookingId)美元argumentType=美元论点- >方法();如果(!美元argumentType| | ! is_subclass_of (美元argumentType,IdentifierInterface::类,真正的)){返回[];}/ /获取值的要求,基于参数名称美元价值=美元请求- >属性- >get (美元论点- >getName ());如果(! is_string (美元价值)){返回[];}/ /创建并返回的值对象返回(美元argumentType::fromString (美元价值));}}
该方法首先检查是否能解决价值:
- 参数必须与一个类实现一个type-hinted习俗
IdentifierInterface
; - 参数名称(如。
$ id
)必须匹配请求属性的名称(如使用/预订/ {id}
路线占位符)。
当这些需求得到满足之后,该方法创建一个新的自定义值对象的实例,并返回这个参数的值。
就是这样!现在你要做的就是添加服务容器的配置。这可以通过标签服务controller.argument_value_resolver
和添加一个优先级:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10
#配置/ services.yaml服务:_defaults:#……确保启用了自动装配自动装配:真正的#……App \ ValueResolver \ BookingIdValueResolver:标签:- - - - - -{名称:controller.argument_value_resolver,优先级:150年}
而添加优先级是可选的,建议添加一个确保注入期望值。内置的RequestAttributeValueResolver
获取属性请求
的优先级One hundred.
。如果您的解析器也获取请求
属性,设定优先级One hundred.
或者更多。否则,设置优先级低于One hundred.
确保参数解析器并不时触发请求
属性是礼物。
确保您的解析器添加正确的位置您可以运行以下命令来查看哪些参数解析器现在和顺序运行:
1
美元php bin /控制台调试:debug.argument_resolver容器。内部——show-arguments