控制器
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
控制器
ob娱乐下载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 22
名称空间AppBundle\控制器;使用AppBundle\实体\帖子;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\路由\注释\路线;类DefaultController扩展控制器{/ * * *@Route(" name = "主页")* /公共函数indexAction(){美元的帖子=美元这- >getDoctrine ()- >getRepository (Post::类)- >findLatest ();返回美元这- >呈现(“违约/ index.html.twig”,(“文章”= >美元的帖子]);}}
获取服务
如果你扩展了基本控制器
类,你可以直接从容器通过访问服务$ this - >容器- > get ()
或$ this - > get ()
。相反,你应该使用依赖注入来获取服务方法参数类型提示行动:
最佳实践
不要使用$ this - > get ()
或$ this - >容器- > get ()
从容器中获取服务。相反,使用依赖注入。
不直接从容器中获取服务,你可以使你的服务私人,几个优势。
使用ParamConverter
如果你使用原则,你就可以(可选)使用ParamConverter自动查询一个实体并将它作为参数传递给控制器。
最佳实践
使用ParamConverter技巧自动查询学说实体的简单和方便。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用AppBundle\实体\帖子;使用ob娱乐下载\组件\路由\注释\路线;/ * * *@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 (Post::类)- >findOneBy ([“鼻涕虫”= >美元postSlug]);如果(!美元帖子){扔美元这- >createNotFoundException ();}/ /……}
您还可以使用@ParamConverter
配置,无限灵活:
1 2 3 4 5 6 7 8 9 10 11 12 13
使用AppBundle\实体\帖子;使用Sensio赞助\包\FrameworkExtraBundle\配置\ParamConverter;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\路由\注释\路线;/ * * *@Route(“/评论/ {postSlug} /新”,name = " comment_new ") *@ParamConverter(“文章”,选项={“映射”= {“postSlug”=“鼻涕虫”}})* /公共函数newAction(请求美元请求,后美元帖子){/ /……}
关键是这样的:大多数情况下的ParamConverter捷径是伟大的。然而,没有错与对实体的查询直接ParamConverter是否会变得复杂。