控制器

编辑该页面

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

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

控制器

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

你的控制器方法应该调用其他服务,如果需要触发一些事件,然后返回一个响应,但他们不应该包含任何实际的业务逻辑。如果他们这样做,重构出来的控制器和一个服务。

最佳实践

让你的控制器扩展AbstractController基地Symfony提供的控制器,使用注释来配置路由缓存和欧宝娱乐app下载地址尽可能的安全。

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

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

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

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

控制器动作命名

最佳实践

不添加行动后缀控制器的方法操作。

第一个要求控制器方法欧宝娱乐app下载地址名称以Symfony版本行动(如。newAction (),showAction ())。这个后缀成为可选注释介绍了控制器。在现代Symfony欧宝娱乐app下载地址应用后缀既不需要,也不推荐这样做,那么您可以安全地删除它。

路由配置

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

1 2 3 4
#配置/ routes.yaml控制器:资源:“. . / src /控制器/”类型:注释

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

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

                 
                  /├─……└─src /├─……└─控制器/├─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
名称空间应用程序\控制器;使用应用程序\实体\帖子;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\路由\注释\路线;DefaultController扩展AbstractController{/ * * *@Route(" name = "主页")* /公共函数指数(){美元的帖子=美元- >getDoctrine ()- >getRepository (Post::类)- >findLatest ();返回美元- >呈现(“违约/ index.html.twig”,(“文章”= >美元的帖子]);}}

获取服务

如果你扩展了基本AbstractController类,你不能直接从容器通过访问服务$ 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
使用应用程序\实体\帖子;使用欧宝娱乐app下载地址\组件\路由\注释\路线;/ * * *@Route(name = " / {id}”“admin_post_show”) * /公共函数显示(文章美元帖子){美元deleteForm=美元- >createDeleteForm (美元帖子);返回美元- >呈现(“管理/ post / show.html.twig”,(“职位”= >美元帖子,“delete_form”= >美元deleteForm- >createView ()));}

通常,你会期望$ id参数显示()。相反,通过创建一个新的参数(美元的帖子)和类型提示的帖子类(这是一个原则的实体),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 ") * /公共函数(请求美元请求,美元postSlug){美元帖子=美元- >getDoctrine ()- >getRepository (Post::类)- >findOneBy ([“鼻涕虫”= >美元postSlug]);如果(!美元帖子){美元- >createNotFoundException ();}/ /……}

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

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

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

前后钩子

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


下一个:模板

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