@ParamConverter
编辑该页面@ParamConverter
使用
的@ParamConverter
注释的电话转换器将请求参数转换成对象。这些对象被存储为请求属性,所以他们可以作为控制器方法注入参数:
- 注释
- 属性
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\路由\注释\路线;使用Sensio赞助\包\FrameworkExtraBundle\配置\ParamConverter;/ * * *@Route(" /博客/ {id} ") *@ParamConverter(“后”,class = " SensioBlogBundle:文章”)* /公共函数显示(文章美元帖子){}
一些事情发生在引擎盖下面:
- 转换器试图得到一个
SensioBlogBundle:文章
从请求(请求属性对象占位符,这来自路线id
); - 如果没有
帖子
找到对象,a404年
反应生成的; - 如果一个
帖子
找到对象,一个新的帖子
请求属性定义(通过请求- >属性- >获取美元(职位)
); - 至于其他请求属性,它是自动注入在控制器出现在方法签名。
如果使用类型提示,在上面的例子中,你甚至可以省略了@ParamConverter
注释:
1 2 3 4
/ /自动方法签名公共函数显示(文章美元帖子){}
你可以禁用type-hinted方法参数的自动转换功能通过设置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(转换器=“名称”)
选择名字的转换器。 - 否则所有注册参数转换器由优先级迭代。的
支持()
方法被调用,以检查是否一个param转换器可以将请求转换成所需的参数。如果它返回真正的
调用参数转换器。
内置的转换器
包有两个内置的转换器,原则和一个DateTime转换器。
教义转换器
转换器的名字:doctrine.orm
教义转换器试图请求属性转换为教义实体从数据库获取。几种不同的方法:
1)自动获取
如果你的路线通配符匹配属性的实体,然后转换器将自动获取:
- 注释
- 属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ * * *获取通过主键,因为{id}的路线。* *@Route(" /博客/ {id} ") * /公共函数showByPk(文章美元帖子){}/ * * *执行findOneBy(){蛞蝓}蛞蝓属性匹配。* *@Route(“/博客/{蛞蝓}”)* /公共函数显示(文章美元帖子){}
自动抓取工作在这些情况下:
- 如果
{id}
在你的路线,这是用于获取主键通过find ()
方法。 - 转换器将尝试做一个
findOneBy ()
获取通过使用所有通配符的路线,实际上是实体的属性(所有权以外被忽略)。
实际上你可以控制这种行为添加的@ParamConverter
注释和使用@ParamConverter选项。
2)获取通过一个表达式
如果自动抓取不工作,使用一个表达式:
- 注释
- 属性
1 2 3 4 5 6 7 8 9
使用Sensio赞助\包\FrameworkExtraBundle\配置\实体;/ * * *@Route(" /博客/ {post_id} ") *@ entity(“文章”,expr = " repository.find post_id ") * /公共函数显示(文章美元帖子){}
使用特殊的@ entity
注释的expr
选择存储库获取对象通过调用一个方法。的存储库
方法将实体的存储库类和通配符——就像任何路线{post_id}
作为变量提供。
提示
的@ entity
注释是一个使用的快捷方式expr
同样的选择@ParamConverter
。
这也可以用来帮助解决多个参数:
- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(“/博客/ {id} /评论/ {comment_id} ") *@ entity(“评论”,expr = " repository.find comment_id ") * /公共函数显示(文章美元帖子、评论美元评论){}
在上面的示例中,美元的帖子
参数是自动处理的,但是美元的评论
配置与注释,因为他们不能遵守默认的约定。
DoctrineConverter选项
大量的选项
是可用的@ParamConverter
或(@ entity
控制行为)注释:
id
:如果一个id
选项配置和匹配路由参数,然后转换器会发现主键:- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(" /博客/ {post_id} ") *@ParamConverter(“文章”,选项= {“id”=“post_id”}) * /公共函数showPost(文章美元帖子){}
映射
:配置属性和值来使用findOneBy ()
方法:关键是占位符的路线名称和值是属性名原则:- 注释
- 属性
1 2 3 4 5 6 7 8
/ * * *@Route(“/博客/{日期}/{蛞蝓}/评论/ {comment_slug} ") *@ParamConverter(“文章”,选项={“映射”:{“日期”:“日期”、“鼻涕虫”:“鼻涕虫”}})*@ParamConverter(“评论”,选项={“映射”:{“comment_slug”:“鼻涕虫”}})* /公共函数showComment(文章美元帖子、评论美元评论){}
排除
应该使用在配置属性findOneBy ()
方法不包括一个或多个属性,这样不是所有使用:- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(“/博客/{日期}/{蛞蝓}")*@ParamConverter(“文章”,选项={“排除”:{“日期”}})* /公共函数显示(文章美元帖子,\ DateTime美元日期){}
strip_null
如果这是真的,当findOneBy ()
,值吗零
将不会被用于查询。entity_manager
默认情况下,教义转换器使用默认的实体管理器,但您可以配置:- 注释
- 属性
1 2 3 4 5 6 7
/ * * *@Route(" /博客/ {id} ") *@ParamConverter(“文章”,选项= {“entity_manager”=“foo”}) * /公共函数显示(文章美元帖子){}
evict_cache
如果这是真的,部队教义总是从数据库获取实体而不是缓存。
DateTime转换器
转换器的名字:datetime
datetime转换器将任何路线或请求属性转换成一个datetime实例:
- 注释
- 属性
1 2 3 4 5 6
/ * * *@Route(“/博客/归档/{开始}/ {}”)* /公共函数存档(\ DateTime美元开始,\ DateTime美元结束){}
默认情况下,任何可以解析的日期格式DateTime
构造函数或unix时间戳被接受。你可以通过输入通过更严格的选择:
- 注释
- 属性
1 2 3 4 5 6 7 8
/ * * *@Route(“/博客/归档/{开始}/ {}”)*@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美元配置);}
的支持()
方法必须返回真正的
当它能够转换配置(一个给定的ParamConverter
实例)。
的ParamConverter
实例有三个关于注释的信息:
的名字
:属性名称;类
:属性类名(可以是任何字符串代表一个类名);选项
:一个选项数组。
的应用()
方法被调用时配置支持。基于请求的属性,应该设置一个属性命名$配置- > getName ()
存储一个对象的类$配置- > getClass ()
。
如果您正在使用的服务汽车上牌和自动配置,你做的!你的转换器将自动使用。
你可以注册一个转换器通过优先级,按名称(属性“转换器”),或两者兼而有之。如果你不指定优先级或一个名字,转换器将被添加到转换器堆栈的优先级0
。显式禁用登记按优先级设置优先级= " false "
在你的标签定义。
提示
如果你想自定义参数注入服务或附加参数转换器,重点不应该高于1
。否则,服务不会被加载。
提示
使用DoctrineParamConverter
为自己的转换器类作为模板。