@ParamConverter
编辑本页@ParamConverter
使用
的@ParamConverter
注释的电话转换器将请求参数转换为对象。这些对象被存储为请求属性,因此它们可以被注入为控制器方法参数:
- 注释
- 属性
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\路由\注释\路线;使用Sensio赞助\包\FrameworkExtraBundle\配置\ParamConverter;/ * * *@Route(" /博客/ {id} ") *@ParamConverter("post", class="SensioBlogBundle: post") */公共函数显示(文章$帖子){}
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\路由\注释\路线;使用Sensio赞助\包\FrameworkExtraBundle\配置\ParamConverter;#(路线(/博客/ {id}))#[ParamConverter('post',类:'SensioBlogBundle: post')]公共函数显示(文章$帖子){}
引擎盖下发生了几件事:
- 转换器试图获得一个
SensioBlogBundle:文章
对象的请求属性(请求属性来自路由占位符——这里id
); - 如果没有
帖子
对象,则为404
生成响应; - 如果一个
帖子
对象,则为new帖子
请求属性被定义(通过请求- >属性- >获取美元(职位)
); - 至于其他请求属性,当它出现在方法签名中时,会自动注入到控制器中。
如果像上面的例子中那样使用类型提示,甚至可以省略@ParamConverter
注释:
1 2 3 4
//自动带有方法签名公共函数显示(文章$帖子){}
属性可以禁用类型提示方法参数的自动转换功能auto_convert
旗帜假
:
1 2 3 4 5
#配置/包/ sensio_framework_extra.yamlsensio_framework_extra:要求:转换器:真正的auto_convert:假
你也可以通过名称显式禁用一些转换器:
1 2 3 4 5
#配置/包/ sensio_framework_extra.yamlsensio_framework_extra:要求:转换器:真正的禁用:[' doctrine.orm ',“datetime”]
要检测哪些转换器在一个参数上运行,运行以下过程:
- 的显式转换器选择
@ParamConverter(转换器=“名称”)
选择具有给定名称的转换器。 - 否则,所有已注册的参数转换器将按优先级迭代。的
支持()
方法来检查参数转换器是否可以将请求转换为所需的参数。如果它返回真正的
调用参数转换器。
内置的转换器
该包有两个内置转换器,Doctrine one和DateTime转换器。
教义转换器
转换器的名字:doctrine.orm
Doctrine Converter尝试将请求属性转换为从数据库获取的Doctrine实体。有几种不同的方法:
1)自动获取
如果你的路由通配符匹配你实体上的属性,那么转换器将自动获取它们:
- 注释
- 属性
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/** *通过主键获取,因为{id}在路由中。* *@Route(" /博客/ {id} ") * /公共函数showByPk(文章$帖子){}/** *在slug属性匹配{slug}的地方执行findOneBy()。* *@Route(“/博客/{蛞蝓}”)* /公共函数显示(文章$帖子){}
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/** *通过主键获取,因为{id}在路由中。* /#(路线(/博客/ {id}))公共函数showByPk(文章$帖子){}/** *在slug属性匹配{slug}的地方执行findOneBy()。* /#(路线(/博客/{蛞蝓}))公共函数显示(文章$帖子){}
自动抓取工作在以下情况:
- 如果
{id}
在你的路由中,那么这是用来通过find ()
方法。 - 转换器将尝试执行
findOneBy ()
通过使用所有路由中的通配符实际上是实体上的属性(非属性将被忽略)。
你可以控制这种行为添加的@ParamConverter
注释和使用@ParamConverter选项.
2)通过表达式获取
如果自动抓取不起作用,使用表达式:
- 注释
- 属性
1 2 3 4 5 6 7 8 9
使用Sensio赞助\包\FrameworkExtraBundle\配置\实体;/ * * *@Route(" /博客/ {post_id} ") *@ entity("post", expr="repository.find(post_id)") */公共函数显示(文章$帖子){}
1 2 3 4 5 6 7
使用Sensio赞助\包\FrameworkExtraBundle\配置\实体;#(路线(/博客/ {post_id}))#[Entity('post', expr: 'repository.find(post_id)')]公共函数显示(文章$帖子){}
使用特惠@ entity
使用expr
选项,通过调用存储库上的方法来获取对象。的存储库
方法将是实体的Repository类和任何路由通配符之类的{post_id}
可以作为变量使用。
提示
的@ entity
注释是使用的快捷方式expr
而且有和@ParamConverter
.
这也可以用来帮助解决多个参数:
- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(“/博客/ {id} /评论/ {comment_id} ") *@ entity("comment", expr="repository.find(comment_id)") */公共函数显示(文章$帖子、评论$评论){}
1 2 3 4 5
#(路线(' /博客/ {id} /评论/ {comment_id} '))#[Entity('comment', expr: 'repository.find(comment_id)')]公共函数显示(文章$帖子、评论$评论){}
在上面的例子中,美元的帖子
参数自动处理,但是美元的评论
使用注释配置,因为它们不能同时遵循默认约定。
DoctrineConverter选项
一些选项
可在@ParamConverter
或(@ entity
)注释来控制行为:
id
:如果id
选项被配置并匹配路由参数,那么转换器将通过主键找到:- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(" /博客/ {post_id} ") *@ParamConverter("post", options={"id" = "post_id"}) */公共函数showPost(文章$帖子){}
1 2 3 4 5
#(路线(/博客/ {post_id}))#[实体('post',选项:['id' => 'post_id'])]公共函数showPost(文章$帖子){}
映射
属性中使用的属性和值findOneBy ()
方法:键是路由占位符名称,值是Doctrine属性名称:- 注释
- 属性
1 2 3 4 5 6 7 8
/ * * *@Route(“/博客/{日期}/{蛞蝓}/评论/ {comment_slug} ") *@ParamConverter(“文章”,选项={“映射”:{“日期”:“日期”、“鼻涕虫”:“鼻涕虫”}})*@ParamConverter(“评论”,选项={“映射”:{“comment_slug”:“鼻涕虫”}})* /公共函数showComment(文章$帖子、评论$评论){}
1 2 3 4 5 6
#(路线(' /博客/{日期}/{蛞蝓}/评论/ {comment_slug} '))#【ParamConverter(“文章”,选项:[“映射”= >[“日期”= >“日期”,“鼻涕虫”= >“鼻涕虫”))))#【ParamConverter(“评论”,选项:[“映射”= >[“comment_slug”= >“鼻涕虫”))))公共函数showComment(文章$帖子、评论$评论){}
排除
属性中应使用的属性findOneBy ()
方法不包括一个或多个属性所有使用:- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(“/博客/{日期}/{蛞蝓}")*@ParamConverter("post", options={"exclude": {"date"}}) */公共函数显示(文章$帖子, \ DateTime$日期){}
1 2 3 4 5
#(路线(' /博客/{日期}/{蛞蝓}'))#【ParamConverter(“文章”,选项:[“排除”= >[‘日期’]]))公共函数显示(文章$帖子, \ DateTime$日期){}
strip_null
如果为真,那么何时findOneBy ()
使用了什么值零
将不会用于查询。entity_manager
默认情况下,Doctrine转换器使用默认的实体管理器,但是你可以这样配置:- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(" /博客/ {id} ") *@ParamConverter("post", options={"entity_manager" = "foo"}) */公共函数显示(文章$帖子){}
1 2 3 4 5
#(路线(/博客/ {id}))#[ParamConverter('post', options: ['entity_manager' => 'foo'])]公共函数显示(文章$帖子){}
evict_cache
如果为真,则强制Doctrine始终从数据库而不是缓存中获取实体。
DateTime转换器
转换器的名字:datetime
datetime转换器将任何路由或请求属性转换为一个datetime实例:
- 注释
- 属性
1 2 3 4 5 6
/ * * *@Route(“/博客/归档/{开始}/{}”)* /公共函数存档(\ DateTime$开始, \ DateTime$结束){}
1 2 3 4
#(路线(' /博客/归档/{开始}/{结束}'))公共函数存档(\ DateTime$开始, \ DateTime$结束){}
方法可以解析的任何日期格式DateTime
构造函数或Unix时间戳被接受。你可以更严格地输入通过选项:
- 注释
- 属性
1 2 3 4 5 6 7 8
/ * * *@Route(“/博客/归档/{开始}/{}”)*@ParamConverter("start", options={"format": "!Y-m-d"}) *@ParamConverter("end", options={"format": "!Y-m-d"}) */公共函数存档(\ DateTime$开始, \ DateTime$结束){}
1 2 3 4 5 6
#(路线(' /博客/归档/{开始}/{结束}'))#【ParamConverter(“开始”,选择:[‘格式’= > ' ! Y-m-d ']))#【ParamConverter(“结束”,选项:[‘格式’= > ' ! Y-m-d ']))公共函数存档(\ DateTime$开始, \ DateTime$结束){}
格式错误的约会,比如2017-21-22
将返回404。
创建转换器
所有转换器都必须实现ParamConverterInterface
:
1 2 3 4 5 6 7 8 9 10 11
名称空间Sensio赞助\包\FrameworkExtraBundle\请求\ParamConverter;使用Sensio赞助\包\FrameworkExtraBundle\配置\ParamConverter;使用ob娱乐下载\组件\HttpFoundation\请求;接口ParamConverterInterface{函数应用(请求$请求, ParamConverter$配置);函数支持(ParamConverter$配置);}
的支持()
方法必须返回真正的
当它能够转换给定的配置(aParamConverter
实例)。
的ParamConverter
Instance有三条关于注释的信息:
的名字
:属性名;类
:属性类名(可以是表示类名的任何字符串);选项
:选项数组。
的应用()
方法在支持配置时调用。根据请求属性,它应该设置一个名为配置- > getName ()
,用于存储类的对象配置- > getClass ()
.
如果你在使用服务自动注册和自动配置,你完蛋了!您的转换器将被自动使用。
您可以按优先级、名称(属性“converter”)或两者同时注册转换器。如果未指定优先级或名称,则转换器将以优先级添加到转换器堆栈0
.要按优先级显式禁用注册,必须设置优先级= " false "
在标签定义中。
提示
如果您希望向自定义参数转换器中注入服务或其他参数,则优先级不应高于1
.否则,服务将不会被加载。
提示
使用DoctrineParamConverter
类作为您自己的转换器的模板。