控制器

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.2,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

请求对象创建并返回响应对象。响应可以是HTML页面、JSON、XML、文件下载、重定向、404错误或任何你能想到的东西。控制器执行任意逻辑您的应用程序需要呈现页面的内容。

通过观察实际运行中的Symfony控制器,可以了解这有多简单。欧宝娱乐app下载地址这将呈现一个打印幸运(随机)数字的页面:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src / AppBundle /控制器/ LuckyController.php名称空间AppBundle控制器使用Sensio赞助FrameworkExtraBundle配置路线使用欧宝娱乐app下载地址组件HttpFoundation响应LuckyController/ * * *@Route(“/幸运数字”)* /公共函数numberAction()数量= mt_rand (0One hundred.);返回响应(' '数量' < /身体> < / html >”);}}

但是在现实世界中,为了创建响应,您的控制器可能会做很多工作。它可以从请求中读取信息、加载数据库资源、发送电子邮件或设置用户会话上的信息。但在所有情况下,控制器最终都会返回响应将被传递回客户端的对象。

关闭),控制器通常是控制器类中的一个方法:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src / AppBundle /控制器/ LuckyController.php名称空间AppBundle控制器使用欧宝娱乐app下载地址组件HttpFoundation响应使用Sensio赞助FrameworkExtraBundle配置路线LuckyController/ * * *@Route(“/幸运/数量/{马克斯}")* /公共函数numberAction马克斯数量= mt_rand (0马克斯);返回响应(' '数量' < /身体> < / html >”);}}

控制器是numberAction ()方法,它位于控制器类中LuckyController

这个控制器非常简单:

控制器类。如果你扩展它,这不会改变你的控制器的工作方式,但你可以访问一些辅助方法服务容器(见控制器):一个类似数组的对象,让你访问系统中所有有用的对象。这些有用的对象被调用服务, Symf欧宝娱乐app下载地址ony附带了一个可以呈现Twig模板的服务对象,另一个可以记录消息的服务对象等等。

添加使用声明在控制器类,然后修改LuckyController引申为:

1 2 3 4 5 6 7 8 9
/ / src / AppBundle /控制器/ LuckyController.php名称空间AppBundle控制器使用欧宝娱乐app下载地址FrameworkBundle控制器控制器LuckyController扩展控制器/ /……

助手方法只是使用核心Symfony功能的快捷方式,无论您是否使用基本功能欧宝娱乐app下载地址控制器类。查看运行中的核心功能的一个好方法是查看控制器类。

generateUrl ()方法只是一个辅助方法,为给定的路由生成URL:

1
url->generateUrl (“blog_show”数组“鼻涕虫”= >“slug-value”));

redirectToRoute ()而且重定向()方法:

12 3 4 5 6 7 8 9 10 11 12 13 14
公共函数indexAction()//重定向到“主页”路由返回->redirectToRoute (“主页”);//做一个永久- 301重定向返回->redirectToRoute (“主页”数组(),301);//重定向到带参数的路由返回->redirectToRoute (“blog_show”数组“鼻涕虫”= >“页面”));//从外部重定向返回->重定向(“http://欧宝娱乐app下载地址www.oldmanjams.com/doc”);}

有关更多信息,请参见路由的文章

谨慎

重定向()方法不以任何方式检查其目标。如果重定向到最终用户提供的某个URL,则应用程序可能对未验证重定向安全漏洞

提示

redirectToRoute ()方法只是一个创建响应对象,它专门用于重定向用户。它相当于:

1 2 3 4 5 6
使用欧宝娱乐app下载地址组件HttpFoundationRedirectResponse公共函数indexAction()返回RedirectResponse (->generateUrl (“主页”));}

get ()方法控制器类。以下是您可能需要的几种常见服务:

1 2 3 4 5
模板->get (“模板”);路由器->get (“路由器”);梅勒->get (“梅勒”);

还有什么其他服务?要列出所有服务,请使用调试:容器控制台命令:

1
PHP bin/控制台调试:容器

有关更多信息,请参见服务容器篇文章。

提示

为了得到一个容器配置参数,使用getParameter ()方法:

1
->getParameter (“app.mailer.from”);

控制器类,执行以下操作:

1 2 3 4 5 6 7 8 9 10
公共函数indexAction()//从数据库中检索对象产品=……;如果(!产品) {->createNotFoundException (“产品不存在”);}返回->呈现(…);}

createNotFoundException ()方法只是一个创建特殊的快捷方式NotFoundHttpException对象,最终在Symfony内部触发404 HTTP响应。欧宝娱乐app下载地址

当然,你可以随便扔异常类,Symfony将自动返回一个500的HTTP响应代欧宝娱乐app下载地址码。

1
异常“出事了!”);

在每种情况下,一个错误页面显示给最终用户,一个完整的调试错误页面显示给开发人员(即当你使用app_dev.php前控制器-参见配置Symfony(和环欧宝娱乐app下载地址境)).

您需要自定义用户看到的错误页面。要做到这一点,请参阅如何自定义错误页面篇文章。

getSession ()方法。请求对象。此方法返回一个SessionInterface使用简单的方法从会话中存储和获取东西:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用欧宝娱乐app下载地址组件HttpFoundation请求公共函数indexAction(请求请求会话请求->getSession ();//存储一个属性以便在以后的用户请求中重用会话->集(“foo”“酒吧”);//在另一个请求中获取由另一个控制器设置的属性foobar会话->get (“foobar”);如果该属性不存在,则使用默认值过滤器会话->get (“过滤器”数组());}

存储的属性在该用户会话的剩余时间内保留在会话中。

形式提交:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用欧宝娱乐app下载地址组件HttpFoundation请求公共函数updateAction(请求请求/ /……如果形式->isSubmitted () & &形式->isValid ()) {//执行某种处理->addFlash (“通知”“您的更改被保存了!”);// $this->addFlash()等价于$request->getSession()->getFlashBag()->add()返回->redirectToRoute(…);}返回->呈现(…);}

处理请求后,控制器在会话中设置一个flash消息,然后重定向。消息键(请注意在本例中)可以是任何东西:您将使用此键检索消息。

在下一页的模板中(或者更好的是,在你的基本布局模板中),从会话中读取任何flash消息:

  • 嫩枝
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{# app /资源/视图/ base.html。树枝#}{#你可以读取和显示一个flash消息类型…#}{%在app.session.flashBag.get('notice') %}<div“flash-notice”>{{flash_message}}div>{%endfor%}{#……或者您可以读取和显示每个flash消息可用#}{%在app.session.flashBag.all %}{%flash_messages %}中的Flash_message<div“闪电,{{type}}>{{flash_message}}div>{%endfor%}{%endfor%}

请注意

它很常用请注意警告而且错误作为不同类型的flash消息的键,但您可以使用任何适合您需要的键。

提示

您可以使用peek ()方法来检索消息,同时将其保存在包中。

早些时候,框架将通过请求对象的类型提示的任何控制器参数请求类:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
使用欧宝娱乐app下载地址组件HttpFoundation请求公共函数indexAction(请求请求请求->isXmlHttpRequest ();//它是一个Ajax请求吗?请求->getPreferredLanguage (数组“en”“fr”));//分别获取GET和POST变量请求->查询->get (“页面”);请求->请求->get (“页面”);//检索SERVER变量请求->服务器->get (“HTTP_HOST”);//获取一个由foo标识的UploadedFile实例请求->文件->get (“foo”);//获取COOKIE值请求->饼干->get (“PHPSESSID”);//检索一个HTTP请求头,带有规范化的小写键请求->->get (“主机”);请求->->get (“content_type”);}

请求类有几个公共属性和方法,它们返回关于请求所需的任何信息。

就像请求,响应对象也有一个公共对象财产。这是一个ResponseHeaderBag它有一些很好的方法来获取和设置响应头。标头名称是规范化的,以便使用内容类型等于内容类型甚至content_type

控制器的唯一要求是返回响应对象。的响应类是围绕HTTP响应的抽象——基于文本的消息,充满了发送回客户端的头和内容:

1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址组件HttpFoundation响应//创建一个简单的响应,状态码为200(默认)响应响应(“你好”的名字、响应::并);//创建一个状态码为200的CSS-response响应响应(' <时尚>…> < /风格的);响应->->集(“内容类型”“文本/ css”);

有一些特殊的类可以让某些类型的回答更容易:

另请参阅

现在您已经了解了基本知识,可以继续研究Symfony欧宝娱乐app下载地址请求而且响应对象中的HttpFoundation组件文档欧宝体育电话

控件可从控制器返回JSONjson ()基本控制器上的辅助方法。这返回一个特殊的JsonResponse对象,自动对数据进行编码:

1 2 3 4 5 6 7 8 9
/ /……公共函数indexAction()//返回'{"用户名":"简。并设置正确的Content-Type头返回->json (数组“用户名”= >“jane.doe”));//该快捷方式定义了三个可选参数//返回$this->json($data, $status = 200, $headers = array(), $context = array());

如果序列化器服务在您的应用程序中启用,内容传递到json ()用它编码。否则,json_encode函数被使用。

您可以使用文件()从控制器内部提供文件的Helper:

1 2 3 4 5
公共函数fileAction()//发送文件内容并强制浏览器下载它返回->文件(“/道路/ / some_file.pdf”);}

文件()Helper提供了一些参数来配置它的行为:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址组件HttpFoundation文件文件使用欧宝娱乐app下载地址组件HttpFoundationResponseHeaderBag公共函数fileAction()//从文件系统中加载文件文件文件(“/道路/ / some_file.pdf”);返回->文件(文件);//重命名下载的文件返回->文件(文件“custom_name.pdf”);//在浏览器中显示文件内容而不是下载它返回->文件(“invoice_3241.pdf”“my_invoice.pdf”, ResponseHeaderBag::DISPOSITION_INLINE);}

响应返回给用户的对象。

为了使生活更简单,您可能会扩展基础控制器类,因为这给出了两个东西:

A)快捷方法(如呈现()而且redirectToRoute ());

B)访问所有来获取系统中有用的对象(服务)
get ()方法。

在其他文章中,您将学习如何从控制器内部使用特定的服务,这些服务将帮助您持久化和从数据库中获取对象、处理表单提交、处理缓存等。

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