控制器
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
控制器
您创建一个控制器是一个PHP函数,需要来自HTTP请求的信息和构造并返回一个HTTP响应(Symfony2ob娱乐下载响应
对象)。响应可以是一个HTML页面,一个XML文档,序列化JSON数组,一个图像,一个重定向,404错误或其他任何你能想到的。控制器包含任何任意的逻辑您的应用程序需要呈现的内容页面。
看看简单的通过观察Symfony2控制器在行动。ob娱乐下载下面的控制器将呈现一个页面,该页面只打印你好世界!
:
1 2 3 4 5 6
使用ob娱乐下载\组件\HttpFoundation\响应;公共函数helloAction(){返回新响应(“Hello world !”);}
一个控制器的目标都是相同的:创建并返回一个响应
对象。在这个过程中,它可能从请求,读取信息加载数据库资源,发送电子邮件,或一组用户的会话信息。但是在所有情况下,控制器将最终返回响应
对象,将返回到客户机。
没有魔法和没有其他需求担心!这里有一些常见的例子:
- 控制器的一个准备一个
响应
对象代表了网站的首页的内容。 - 控制器B读取
鼻涕虫
从请求参数从数据库加载一个博客条目,创建一个响应
对象显示博客。如果鼻涕虫
数据库中无法找到,它会创建并返回一个吗响应
对象与一个404状态码。 - 控制器C处理表单提交的联系形式。从请求中读取表单信息,保存联系人信息到数据库和电子邮件网站管理员的联系信息。最后,它会创建一个
响应
对象浏览器重定向客户的接触形式“谢谢”页面。
请求,控制器,反应周期
每个请求由Symfony2项目经过相同的简单的生命周期ob娱乐下载。框架的重复性任务,最终执行一个控制器,房屋定制应用程序代码:
- 每个请求都是由一个前端控制器文件(如处理。
app.php
或app_dev.php
),出人头地的应用程序; - 的
路由器
从请求中读取信息(如URI),找到相匹配的路由信息,并读取_controller
从路由参数; - 的控制器匹配路线和里面的代码执行控制器创建并返回一个
响应
对象; - 的HTTP header和内容
响应
对象发送回客户端。
创建一个页面一样容易创建一个控制器(# 3),使路线,将URL映射到控制器(# 2)。
请注意
虽然同样命名,“前端控制器”不同于“控制器”谈到了在这一章。前端控制器是一个简短的PHP文件,住在您的web目录,并通过指导的所有请求。一个典型的应用程序将有一个前端控制器(如生产。app.php
)和开发前端控制器(如。app_dev.php
)。你可能不需要编辑、视图或担心前面控制器在应用程序中。
一个简单的控制器
当一个控制器可以是任何PHP调用(一个对象上的一个函数,方法,或一个关闭
),在Symob娱乐下载fony2控制器通常是一个单一的方法在一个控制器对象。控制器也被称为行动。
1 2 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间Acme\HelloBundle\控制器;使用ob娱乐下载\组件\HttpFoundation\响应;类HelloController{公共函数indexAction(美元的名字){返回新响应(“< html > <身体>你好”。美元的名字。”! < /身体> < / html > ');}}
提示
请注意,控制器是indexAction
方法,它生活在一个控制器类(HelloController
)。不要被命名:a控制器类仅仅是一个方便的方式组几个控制器/动作起来。通常情况下,控制器类将房子几个控制器/动作(如。updateAction
,deleteAction
等等)。
这个控制器是很简单的:
- 4号线:Sob娱乐下载ymfony2利用PHP 5.3名称空间功能名称空间整个控制器类。的
使用
关键词导入响应
类,它的控制器必须返回。 - 6号线:类名的串联控制器类的名称(即。
你好
),这个词控制器
。这是一个惯例,为控制器提供一致性,并允许他们只能被引用名称的第一部分(即。你好
在路由配置。 - 8号线:每个操作在一个控制器类后缀为
行动
中引用,路由配置操作的名称(指数
)。在下一节中,您将创建一个URI映射到这一行动的路线。您将了解如何路线的占位符({名称}
)成为动作方法的参数(美元的名字
)。 - 10号线:控制器创建并返回一个
响应
对象。
将URL映射到一个控制器
新控制器返回一个简单的HTML页面。要在您的浏览器中查看此页面,您需要创建一个路线,地图一个特定的URL模式的控制器:
- YAML
- XML
- PHP
1 2 3 4
# app / config / routing.yml你好:模式:/ hello /{名称}默认值:{_controller:AcmeHelloBundle:你好:索引}
1 2 3 4
< !——app / config /路由。xml - - ><路线id=“你好”模式=“你好/{名称}”><默认的关键=“_controller”>AcmeHelloBundle:你好:索引< /默认的>< /路线>
1 2 3 4
/ / app / config / routing.php美元集合- >add (“你好”,新路线(“/ hello /{名称}”,数组(“_controller”= >“AcmeHelloBundle:你好:指数”)));
要瑞安/ hello /
现在执行的HelloController: indexAction ()
控制器和经过瑞安
为美元的名字
变量。创建一个“页面”意味着简单的创建一个控制器方法和相关的路线。
注意语法指控制器:AcmeHelloBundle:你好:索引
。ob娱乐下载Symfony2使用一个灵活的字符串符号来引用不同的控制器。这是最常见的语法和告诉Symfony2找一个控制器类ob娱乐下载HelloController
在一个包命名AcmeHelloBundle
。该方法indexAction ()
然后执行。
更多细节的字符串格式用于引用不同的控制器,明白了路由。
请注意
这个例子的地方直接路由配置应用程序/配置/
目录中。一种更好的方式来组织你的路线是包中的每个路由它属于的地方。更多信息,见路由。
提示
你可以了解更多的路由系统路由章。
线路参数作为控制器参数
你已经知道_controller
参数AcmeHelloBundle:你好:索引
是指一个HelloController: indexAction ()
方法内的生活AcmeHelloBundle
包。更有趣的是传递给该方法的参数:
1 2 3 4 5 6 7 8 9 10 11 12
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间Acme\HelloBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;类HelloController扩展控制器{公共函数indexAction(美元的名字){/ /……}}
控制器有一个参数,美元的名字
,对应于{名称}
从匹配的路由参数(瑞安
在这个例子中)。事实上,当执行控制器,Symfony2匹配每个参数的控制器的一个参数匹配的路线。ob娱乐下载下面的例子:
- YAML
- XML
- PHP
1 2 3 4
# app / config / routing.yml你好:模式:/ hello / {first_name} / {last_name}默认值:{_controller:AcmeHelloBundle:你好:指数,颜色:绿色}
1 2 3 4 5
< !——app / config /路由。xml - - ><路线id=“你好”模式=“/ hello / {first_name} / {last_name}”><默认的关键=“_controller”>AcmeHelloBundle:你好:索引< /默认的><默认的关键=“颜色”>绿色< /默认的>< /路线>
1 2 3 4 5
/ / app / config / routing.php美元集合- >add (“你好”,新路线(' / hello / {first_name} / {last_name}’,数组(“_controller”= >“AcmeHelloBundle:你好:指数”,“颜色”= >“绿色”)));
这个可以有多个参数的控制器:
1 2 3 4
公共函数indexAction(美元first_name,美元last_name,美元颜色){/ /……}
请注意,两个占位符变量({first_name}
,{last_name}
)以及违约颜色
可用变量作为参数的控制器。路线相匹配时,占位符变量与合并违约
让一个数组用于控制器。
映射路径参数控制器参数是容易的和灵活的。记住下面的指导方针而开发。
控制器参数的顺序无关紧要
ob娱乐下载Symfony能够匹配的参数名称路径中的变量名控制器方法的签名。换句话说,它意识到的
{last_name}
参数匹配的last_name美元
论点。控制器的参数可以完全重新排序,仍然工作完美:1 2 3 4
公共函数indexAction(美元last_name,美元颜色,美元first_name){/ /……}
每个所需控制器参数必须匹配路由参数
以下将抛出一个
RuntimeException
因为没有喷火
参数定义的路线:1 2 3 4
公共函数indexAction(美元first_name,美元last_name,美元颜色,美元喷火){/ /……}
使参数可选的,然而,是非常好的。下面的例子不会抛出异常:
1 2 3 4
公共函数indexAction(美元first_name,美元last_name,美元颜色,美元喷火=“酒吧”){/ /……}
并不是所有的路由参数需要在你的控制器参数
例如,如果
last_name
不重要的控制器,你可以完全忽略它:1 2 3 4
公共函数indexAction(美元first_name,美元颜色){/ /……}
提示
每一个路由也有一个特殊的_route
参数,也就是匹配的路由的名称(如。你好
)。虽然不是通常有用,这同样是可以作为一个控制器参数。
的请求
作为一个控制器参数
为了方便,你也可以有Symfony通过你ob娱乐下载请求
你的控制器对象作为参数。这一点尤其方便当你处理形式,例如:
1 2 3 4 5 6 7 8 9
使用ob娱乐下载\组件\HttpFoundation\请求;公共函数updateAction(请求美元请求){美元形式=美元这- >createForm (…);美元形式- >bind (美元请求);/ /……}
基本控制器类
为了方便起见,Symfony2附带ob娱乐下载了一个基地控制器
控制器类,协助一些最常见的任务也给你控制器类访问任何资源可能需要。通过扩展这个控制器
类,您可以利用一些辅助方法。
添加使用
声明在控制器
类,然后修改HelloController
扩展:
1 2 3 4 5 6 7 8 9 10 11 12 13
/ / src / Acme / HelloBundle /控制器/ HelloController.php名称空间Acme\HelloBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\HttpFoundation\响应;类HelloController扩展控制器{公共函数indexAction(美元的名字){返回新响应(“< html > <身体>你好”。美元的名字。”! < /身体> < / html > ');}}
这实际上并不改变任何关于控制器是如何工作的。在下一节中,您将了解基础控制器类的辅助方法。这些方法只是快捷键使用核心Symfony2功能可用的或不使用的基础ob娱乐下载控制器
类。一个伟大的方式行动的核心功能是查看控制器类本身。
提示
扩展基类可选在Syob娱乐下载mfony;它包含有用的快捷键但没有强制性的。你也可以扩展ContainerAware。服务容器对象将被通过容器
财产。
请注意
您还可以定义你控制器作为服务。
常见的控制器任务
虽然一个控制器可以做几乎任何事情,大多数控制器将执行一遍又一遍相同的基本任务。这些任务,如重定向、转发,使模板和访问核心服务,在Symfony2非常容易管理。ob娱乐下载
重定向
如果你想将用户重定向到另一个页面,使用重定向()
方法:
1 2 3 4
公共函数indexAction(){返回美元这- >重定向(美元这- >generateUrl (“主页”));}
的generateUrl ()
方法只是一个helper函数,生成给定的URL路径。有关更多信息,请参见路由一章。
默认情况下,重定向()
方法执行302(临时)定向。执行301(永久)定向、修改第二个参数:
1 2 3 4
公共函数indexAction(){返回美元这- >重定向(美元这- >generateUrl (“主页”),301年);}
提示
的重定向()
方法是一个简单的创建一个快捷方式响应
对象,专门从事重定向用户。等价于:
1 2 3
使用ob娱乐下载\组件\HttpFoundation\RedirectResponse;返回新RedirectResponse (美元这- >generateUrl (“主页”));
转发
您还可以轻松地期待另一个控制器的内部转发()
方法。,而不是重定向用户的浏览器,它使一个内部sub-request,并调用指定的控制器。的转发()
方法返回响应
返回的对象控制器:
1 2 3 4 5 6 7 8 9 10 11
公共函数indexAction(美元的名字){美元响应=美元这- >转发(“AcmeHelloBundle:你好:幻想”,数组(“名字”= >美元的名字,“颜色”= >“绿色”));/ /……进一步修改直接响应或返回它返回美元响应;}
注意,提出了()的方法使用相同的字符串表示的控制器用于路由配置。在这种情况下,目标控制器类HelloController
在一些AcmeHelloBundle
。这个数组传递给方法成为参数产生的控制器。当使用这个相同的接口将控制器嵌入到模板(见创建和使用模板)。目标控制器方法类似于以下几点:
1 2 3 4
公共函数fancyAction(美元的名字,美元颜色){/ /……创建并返回一个响应对象}
就像为路线,当创建一个控制器参数的顺序fancyAction
没关系。ob娱乐下载(如Symfony2匹配索引键的名字。的名字
(如)方法参数名称。美元的名字
)。如果你改变参数的顺序,Symfony2仍将正确的值传递给每个变量。ob娱乐下载
提示
像其他基地控制器
方法,向前
方法就是一个核心Symfony2功能的快捷方式。ob娱乐下载一个可以直接通过完成http_kernel
服务和返回一个响应
对象:
1 2 3 4 5 6 7 8
美元httpKernel=美元这- >容器- >get (“http_kernel”);美元响应=美元httpKernel- >转发(“AcmeHelloBundle:你好:幻想”,数组(“名字”= >美元的名字,“颜色”= >“绿色”));
渲染模板
虽然不是必需的,但大多数控制器将最终呈现的模板负责生成的HTML(或其他形式)控制器。的renderView ()
方法呈现一个模板,并返回它的内容。内容模板可以用来创建一个响应
对象:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\HttpFoundation\响应;美元内容=美元这- >renderView (“AcmeHelloBundle:你好:index.html.twig”,数组(“名字”= >美元的名字));返回新响应(美元内容);
这甚至可以只在一个步骤中完成的呈现()
方法,该方法返回一个响应
从模板对象包含内容:
1 2 3 4
返回美元这- >呈现(“AcmeHelloBundle:你好:index.html.twig”,数组(“名字”= >美元的名字));
在这两种情况下,资源/视图/ Hello / index.html.twig
模板内的AcmeHelloBundle
将会呈现。
Symfob娱乐下载ony模板引擎的详细解释模板一章。
提示
你甚至可以避免调用渲染
方法通过使用@Template
注释。看到FrameworkExtraBundle更多细节。
提示
的renderView
方法是直接使用的快捷方式模板
服务。的模板
服务也可以直接使用:
1 2 3 4 5
美元模板=美元这- >get (“模板”);美元内容=美元模板- >呈现(“AcmeHelloBundle:你好:index.html.twig”,数组(“名字”= >美元的名字));
请注意
可以渲染模板在更深层次的子目录,但是应该注意避免的陷阱,让你的目录结构过于复杂的:
1 2 3 4 5
美元模板- >呈现(“AcmeHelloBundle:你好/问候:index.html.twig”,数组(“名字”= >美元的名字));/ / index . html。树枝在资源呈现/视图/ Hello /问候。
管理错误和404页
当事情没有找到时,你应该与HTTP协议并返回一个404响应。要做到这一点,你就会抛出一个特殊类型的异常。如果你扩展基本控制器类,执行以下操作:
1 2 3 4 5 6 7 8 9 10
公共函数indexAction(){/ /从数据库检索对象美元产品=……;如果(!美元产品){扔美元这- >createNotFoundException (的产品不存在);}返回美元这- >呈现(…);}
的createNotFoundException ()
方法创建一个特殊的NotFoundHttpException
对象,最终引发了404年在Symfony HTTP响应。ob娱乐下载
当然,你可以把任何异常
在控制器类——Symfony2将自动返回一个HTTP响ob娱乐下载应代码500。
1
扔新\异常(“事情错了!”);
在每一个案例中,一个错误页面样式显示给最终用户和一个完整的调试错误页面显示开发人员(在调试模式下的情况下查看页面时)。这两个可以自定义的错误页面。详情,请阅读“如何自定义错误页面吗“食谱配方。
管理会话
ob娱乐下载Symfony2提供了一个会话对象,您可以使用它来存储用户信息(使用浏览器是一个真正的人,一个机器人,或web服务)之间的请求。默认情况下,Symfonob娱乐下载y2属性存储在一个cookie使用原生PHP会话。
从会话存储和检索信息可以很容易地实现从任何控制器:
1 2 3 4 5 6 7 8 9 10
美元会话=美元这- >getRequest ()- >getSession ();/ /存储一个属性在后面的用户请求重用美元会话- >集(“foo”,“酒吧”);/ /在另一个请求的另一个控制器美元喷火=美元会话- >get (“foo”);/ /使用默认值,如果不存在的关键美元过滤器=美元会话- >get (“过滤器”,数组());
这些属性将保持在用户用户会话的其余部分。
Flash的消息
您还可以存储小消息,将存储在用户的会话为一个额外的请求。这是有用的在处理形式:你想重定向,有一个特别的消息显示在下一个请求。这些类型的消息被称为“闪电”消息。
例如,想象你正在处理一个表单提交:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
公共函数updateAction(){美元形式=美元这- >createForm (…);美元形式- >bind (美元这- >getRequest ());如果(美元形式- >isValid ()) {/ /做一些处理美元这- >get (“会话”)- >getFlashBag ()- >add (“通知”,“您的更改得救了!”);返回美元这- >重定向(美元这- >generateUrl (…));}返回美元这- >呈现(…);}
在处理请求之后,控制器设置一个请注意
flash消息,然后重定向。的名称(请注意
)并不重要——这正是你使用来确定消息的类型。
模板的下一个动作,可以使用下面的代码来呈现请注意
信息:
- 嫩枝
- PHP
1 2 3 4 5
{%为在app.session.flashbag.get flashMessage(“通知”)%}<div类=“flash-notice”>{{flashMessage}}< /div>{%endfor%}
1 2 3 4 5
< ? phpforeach(美元视图(“会话”]- >getFlashBag ()- >get (“通知”)作为美元消息):? ><div类=“flash-notice”>< ? php回声“< div class = ' flash-error > < / div >“美元? >< /div>< ? phpendforeach;? >
通过设计、flash消息是为了生活为一个请求(他们“飞驰”)。他们是设计用于在重定向你在本例中所做的一样。
响应对象
控制器是返回一个唯一的要求响应
对象。的响应抽象类是一个PHP在HTTP响应——基于文本的消息充满了HTTP header和发送回客户机的内容:
1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\HttpFoundation\响应;/ /创建一个简单的响应与一个200状态码(默认)美元响应=新响应(“你好”。美元的名字,200年);/ /创建一个json响应与一个200状态码美元响应=新响应(json_encode (数组(“名字”= >美元的名字)));美元响应- >头- >集(“内容类型”,“application / json”);
提示
的头
属性是一个HeaderBag对象与几个有用的方法来阅读和变异响应
头。标题名称规范化,以便使用内容类型
相当于内容类型
甚至content_type
。
提示
还有一个特别的JsonResponse类,帮助返回JSON响应。看到HttpFoundation组件。
请求对象
除了路由占位符的值,控制器也有访问请求
当扩展基础对象控制器
类:
1 2 3 4 5 6 7 8 9
美元请求=美元这- >getRequest ();美元请求- >isXmlHttpRequest ();/ /一个Ajax请求吗?美元请求- >getPreferredLanguage (数组(“en”,“fr”));美元请求- >查询- >get (“页面”);/ /得到一个$ _GET参数美元请求- >请求- >get (“页面”);/ /得到一个$ _POST参数
就像响应
对象,存储在一个请求头HeaderBag
对象并易于接近。
最终的想法
当你创建一个页面,你最终需要编写一些代码,其中包含页面的逻辑。在Syob娱乐下载mfony中,这被称为一个控制器,它是一个PHP函数,可以做任何事需要为了返回最后一个响应
对象将被返回给用户。
为了使生活更容易,你可以选择扩展基础控制器
类,它包含许多常见控制器任务的快捷方法。例如,既然你不想把HTML代码在你的控制器,可以使用呈现()
方法来呈现和返回一个模板的内容。
在其他章节中,您将看到如何控制器可用于保存和获取对象从数据库,流程表单提交处理缓存和更多。