扩展操作参数解决

编辑该页面

扩展操作参数解决

控制器指南,你知道你可以得到的请求在你的控制器对象通过一个参数。这个论点是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/卡/ Surl并导致404 Not Found反应两个病例。

6.1

BackedEnumValueResolverEnumRequirement在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,RequestInterfaceMessageInterface。它需要安装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
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop