控制器
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
控制器
ob娱乐下载Symfony遵循的哲学“瘦控制器和胖模型”.这意味着控制器应该只保留薄薄的一层胶水代码需要协调应用程序的不同部分。
您的控制器方法应该只调用其他服务,在需要时触发一些事件,然后返回响应,但它们不应该包含任何实际的业务逻辑。如果存在,则将其从控制器重构到服务中。
最佳实践
使您的控制器扩展AbstractController
Symfony提供的基本控制器,并尽可能使用注释来配置路ob娱乐下载由、缓存和安全。
将控制器与底层框架耦合,可以利用其所有特性并提高工作效率。
因为你的控制器应该很薄,只包含几行胶水代码从长远来看,花费数小时试图将它们从框架中解耦并不会给您带来好处。时间的数量浪费了不值得你这么做。
此外,使用注释进行路由、缓存和安全可以简化配置。您不需要浏览以不同格式(YAML, XML, PHP)创建的数十个文件:所有配置都只是在您需要的地方,它只使用一种格式。
总的来说,这意味着您应该积极地将业务逻辑与框架解耦,同时积极地耦合控制器和路由来框架,以便最大限度地利用它。
控制器动作命名
最佳实践
不要添加行动
控制器动作的方法的后缀。
第一个Symfonyob娱乐下载版本要求控制器方法名以行动
(如。newAction ()
,showAction ()
).当为控制器引入注释时,这个后缀成为可选的。在现代的Symfonob娱乐下载y应用程序中,这个后缀既不是必需的,也不是推荐的,所以您可以安全地删除它。
路由配置
要在控制器中加载定义为注解的路由,请将以下配置添加到主路由配置文件中:
1 2 3 4
#配置/ routes.yaml控制器:资源:“. . / src /控制器/”类型:注释
对象中存储的任何控制器都会加载注释src /控制器/
目录,甚至从其子目录。因此,如果你的应用程序定义了很多控制器,将它们重新组织到子目录中是完全可以的:
12 3 4 5 6 7 8 9 10 11 12 13
/├─…├─src/├─…├─Controller/├─DefaultController.php├─…├─Api/│├─…│├─……├─后端/├─…└─……
模板配置
最佳实践
不要使用@Template
注释来配置控制器使用的模板。
的@Template
注释是有用的,但也涉及到一些魔力。我们不认为它的好处是值得魔法,所以建议不要使用它。
大多数时候,@Template
使用时不带任何参数,这使得更难以知道正在呈现哪个模板。它还使初学者不太明显,控制器应该总是返回一个响应对象(除非你使用的是视图层)。
控制器是什么样子的
考虑到所有这些,下面是我们的应用程序主页控制器的示例:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
名称空间应用程序\控制器;使用应用程序\实体\帖子;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\路由\注释\路线;类DefaultController扩展AbstractController{/ * * *@Route("/", name="首页")*/公共函数指数(){$的帖子=$这->getDoctrine ()->getRepository (Post::类)->findLatest ();返回$这->呈现(“违约/ index.html.twig”, (“文章”= >$的帖子]);}}
获取服务
如果你延伸底部AbstractController
类时,您不能直接从容器通过访问服务$ this - >容器> get ()
或$ this - > get ()
.相反,您必须使用依赖注入来获取服务:这是最容易做到的类型提示操作方法参数:
最佳实践
不要使用$ this - > get ()
或$ this - >容器> get ()
从容器中获取服务。相反,使用依赖注入。
通过不直接从容器中获取服务,您可以使您的服务私人,其中有几个优势.
使用ParamConverter
如果你用的是教义,那就可以(可选)使用ParamConverter自动查询一个实体并将其作为参数传递给控制器。
最佳实践
在简单方便的情况下,使用ParamConverter技巧自动查询Doctrine实体。
例如:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用应用程序\实体\帖子;使用ob娱乐下载\组件\路由\注释\路线;/ * * *@Route("/{id}", name="admin_post_show") */公共函数显示(文章$帖子){$deleteForm=$这->createDeleteForm ($帖子);返回$这->呈现(“管理/ post / show.html.twig”, (“职位”= >$帖子,“delete_form”= >$deleteForm->createView ()));}
通常情况下,你会期望$ id
参数显示()
.相反,通过创建一个新参数(美元的帖子
),然后用帖子
类(Doctrine实体),ParamConverter自动查询对象$ id
属性匹配{id}
价值。如果没有,它还会显示404页面帖子
可以找到。
当事情变得更高级
上面的例子不需要任何配置,因为通配符名{id}
与实体上的属性名称匹配。如果这不是真的,或者如果您有更复杂的逻辑,那么最好的选择是手动查询实体。在我们的应用中,我们有这种情况CommentController
:
12 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
构型,具有无限的灵活性:
12 3 4 5 6 7 8 9 10 11 12 13
使用应用程序\实体\帖子;使用Sensio赞助\包\FrameworkExtraBundle\配置\ParamConverter;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\路由\注释\路线;/ * * *@Route("/comment/{postSlug}/new", name="comment_new") *@ParamConverter(“文章”,选项={“映射”={“postSlug”=“鼻涕虫”}})* /公共函数新(请求$请求,后$帖子){/ /……}
关键在于:ParamConverter快捷方式对于简单的情况非常有用。但是您不应该忘记直接查询实体仍然非常容易。