@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为自己的转换器类作为模板。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。