控制器

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.6,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

控制器

欧宝娱乐app下载地址Symfony遵循的哲学“瘦控制器和脂肪模型”。这意味着控制器应持有的薄层胶水代码需要协调应用程序的不同部分。

作为一个经验法则,你应该遵循5-10-20规则,控制器应该只定义5变量或更少,包含10个动作或少,包括20行代码或在每一个行动。这并不是一门精确的科学,但它可以帮助你意识到当代码应该重构控制器和为服务。

最佳实践

使控制器和控制器扩展FrameworkBundle基地使用注释来配置路由、缓存和尽可能的安全。

耦合控制器底层框架允许您利用它的所有特性和提高你的生产率。

由于控制器应薄,无非包含几行胶水代码,花费数小时试图分离他们从你的框架不你长期受益。的时间浪费了不值得的好处。

此外,使用注释路由缓存和安全简化了配置。你不需要浏览的文件创建不同的格式(YAML、XML、PHP):所有配置只是需要它,它只使用一种格式。

总体而言,这意味着你应该积极分离您的业务逻辑的框架,同时,积极耦合控制器和路由框架,以获得最大的。

路由配置

加载路径定义为注释在你的控制器,添加以下配置的主要路由配置文件:

1 2 3 4
# app / config / routing.yml应用:资源:“@AppBundle /控制器/”类型:注释

这个配置将负载从任何控制器存储在注释src / AppBundle /控制器/目录,甚至从它的子目录。如果您的应用程序定义了大量的控制器,它是完全可以重新组织他们到子目录:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

                 
                  /├─……└─src /└─AppBundle /├─……└─控制器/├─DefaultController。php├─……├─Api /│├─……│└─……└─端/├─……└─……

模板配置

最佳实践

不使用@Template ()注释配置模板使用的控制器。

@Template注释是很有用的,但也包括一些魔法。我们不认为它的好处是值得的魔法,所以不推荐使用它。

大多数时候,@Template没有使用任何参数,这使得很难知道哪个模板被呈现。这也使得初学者不太明显,一个控制器应该返回一个响应对象(除非你使用一个视图层)。

控制器的样子

考虑这一切,这是一个例子的控制器应该寻找我们的应用程序的主页:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
名称空间AppBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用Sensio赞助\\FrameworkExtraBundle\配置\路线;DefaultController扩展控制器{/ * * *@Route(" name = "主页")* /公共函数indexAction(){美元的帖子=美元- >getDoctrine ()- >getRepository (“AppBundle:文章”)- >findLatest ();返回美元- >呈现(“违约/ index.html.twig”,数组(“文章”= >美元的帖子));}}

使用ParamConverter

如果你使用原则,你就可以(可选)使用ParamConverter自动查询一个实体并将它作为参数传递给控制器。

最佳实践

使用ParamConverter技巧自动查询学说实体的简单和方便。

例如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用AppBundle\实体\帖子;使用Sensio赞助\\FrameworkExtraBundle\配置\路线;/ * * *@Route(name = " / {id}”“admin_post_show”) * /公共函数showAction(文章美元帖子){美元deleteForm=美元- >createDeleteForm (美元帖子);返回美元- >呈现(“管理/ post / show.html.twig”,数组(“职位”= >美元帖子,“delete_form”= >美元deleteForm- >createView ()));}

通常,你会期望$ id参数showAction。相反,通过创建一个新的参数(美元的帖子)和类型提示的帖子类(这是一个原则的实体),ParamConverter自动查询的对象$ id属性匹配{id}价值。如果没有它也将显示一个404页面帖子可以找到。

当事情变得更先进

这个工作没有任何配置,因为通配符的名字{id}匹配实体属性的名称。如果这不是真的,或者如果你有更复杂的逻辑,最简单的事情就是手动查询实体。在我们的应用程序中,我们有这个情况CommentController:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ * * *@Route(“/评论/ {postSlug} /新”,name = " comment_new ") * /公共函数newAction(请求美元请求,美元postSlug){美元帖子=美元- >getDoctrine ()- >getRepository (“AppBundle:文章”)- >findOneBy (数组(“鼻涕虫”= >美元postSlug));如果(!美元帖子){美元- >createNotFoundException ();}/ /……}

您还可以使用@ParamConverter配置,无限灵活:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用AppBundle\实体\帖子;使用Sensio赞助\\FrameworkExtraBundle\配置\路线;使用Sensio赞助\\FrameworkExtraBundle\配置\ParamConverter;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;/ * * *@Route(“/评论/ {postSlug} /新”,name = " comment_new ") *@ParamConverter(“文章”,选项={“映射”:{“postSlug”:“鼻涕虫”}})* /公共函数newAction(请求美元请求,后美元帖子){/ /……}

点是:ParamConverter快捷方式的简单情况。但你不应该忘记查询实体直接仍非常容易。

前后钩子

如果您需要执行某些代码的执行之前或之后你的控制器,可以使用EventDispatcher组件前后设置过滤器

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