@ParamConverter

编辑本页

@ParamConverter

使用

@ParamConverter注释的电话转换器将请求参数转换为对象。这些对象被存储为请求属性,因此它们可以被注入为控制器方法参数:

  • 注释
  • 属性
1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址组件路由注释路线使用Sensio赞助FrameworkExtraBundle配置ParamConverter/ * * *@Route(" /博客/ {id} ") *@ParamConverter("post", class="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(“/博客/{蛞蝓}”)* /公共函数显示(文章帖子){}

自动抓取工作在以下情况:

  • 如果{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)") */公共函数显示(文章帖子){}

使用特惠@ 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)") */公共函数显示(文章帖子、评论评论){}

在上面的例子中,美元的帖子参数自动处理,但是美元的评论使用注释配置,因为它们不能同时遵循默认约定。

DoctrineConverter选项

一些选项可在@ParamConverter或(@ entity)注释来控制行为:

  • id:如果id选项被配置并匹配路由参数,那么转换器将通过主键找到:

    • 注释
    • 属性
    1 2 3 4 5 6 7
    / * * *@Route(" /博客/ {post_id} ") *@ParamConverter("post", options={"id" = "post_id"}) */公共函数showPost(文章帖子){}
  • 映射属性中使用的属性和值findOneBy ()方法:键是路由占位符名称,值是Doctrine属性名称:

    • 注释
    • 属性
    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("post", options={"exclude": {"date"}}) */公共函数显示(文章帖子, \ DateTime日期){}
  • strip_null如果为真,那么何时findOneBy ()使用了什么值将不会用于查询。
  • entity_manager默认情况下,Doctrine转换器使用默认的实体管理器,但是你可以这样配置:

    • 注释
    • 属性
    1 2 3 4 5 6 7
    / * * *@Route(" /博客/ {id} ") *@ParamConverter("post", options={"entity_manager" = "foo"}) */公共函数显示(文章帖子){}
  • evict_cache如果为真,则强制Doctrine始终从数据库而不是缓存中获取实体。

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("start", options={"format": "!Y-m-d"}) *@ParamConverter("end", options={"format": "!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使用欧宝娱乐app下载地址组件HttpFoundation请求接口ParamConverterInterface函数应用(请求请求, ParamConverter配置)函数支持(ParamConverter配置);}

支持()方法必须返回真正的当它能够转换给定的配置(aParamConverter实例)。

ParamConverterInstance有三条关于注释的信息:

  • 的名字:属性名;
  • :属性类名(可以是表示类名的任何字符串);
  • 选项:选项数组。

应用()方法在支持配置时调用。根据请求属性,它应该设置一个名为配置- > getName (),用于存储类的对象配置- > getClass ()

如果你在使用服务自动注册和自动配置,你完蛋了!您的转换器将被自动使用。

您可以按优先级、名称(属性“converter”)或两者同时注册转换器。如果未指定优先级或名称,则转换器将以优先级添加到转换器堆栈0.要按优先级显式禁用注册,必须设置优先级= " false "在标签定义中。

提示

如果您希望向自定义参数转换器中注入服务或其他参数,则优先级不应高于1.否则,服务将不会被加载。

提示

使用DoctrineParamConverter类作为您自己的转换器的模板。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。