createNotFoundException()方法创建一个特定的NotFoundHttpException对象,它最终触发404 HTTP回复。当然你从你的controller方法中可以抛出任何类型的Exception 类,Symfony2会自动返回一个500 HTTP回复代码。
throw new \Exception('Something went wrong!');
管理Session
Symfony2 提供了一个非常好的Session对象,你可以用它来在请求之间存贮有关用户的信息。默认情况下,Symfony2 通过PHP本身的Session保存属性到cookie。在任何controller中存储和获取Session信息将非常容易:
$session = $this->getRequest()->getSession(); // 为用户的后一个请求使用存储一个属性 $session->set('foo', 'bar'); // 在另一个controller中为另一个请求获取该属性 $foo = $session->get('foo'); // 设置用户的本地化语言 $session->setLocale('fr');
Flash 消息
你可以为特定的请求存储少量的消息到用户的Session。这在处理一个表单时非常有用,你想重定向和一个特定的信息显示在下一个请求中。这种类型的消息被称为Flash消息。比如,假设你处理一个表单提交:
public function updateAction() { $form = $this->createForm(...); $form->bindRequest($this->getRequest()); if ($form->isValid()) { // 做些排序处理 $this->get('session')->setFlash('notice', 'Your changes were saved!'); return $this->redirect($this->generateUrl(...)); } return $this->render(...); }
此例中,在处理完请求后,controller设置了一个notice flash消息并作了重定向。名字notice没什么意义,只是用于标识该消息。在下一个活动的模板中,下面的代码能够渲染这个notic消息:
Twig
{% if app.session.hasFlash('notice') %} <div> {{ app.session.flash('notice') }} </div> {% endif %}
PHP代码:
<?php if ($view['session']->hasFlash('notice')): ?> <div> <?php echo $view['session']->getFlash('notice') ?> </div> <?php endif; ?>
这样设计,flash消息就能够为准确的某个请求存在了。他们一般被设计出来就是用于重定向的。
Response对象
作为一个Controller来说,唯一必须做到的是返回一个Response对象。
Response对象是一个PHP代码对HTTP Response的抽象。
HTTP Response是一个基于文本的消息有HTTP headers和 返回给客户端的内容组成。
//创建一个简单的Response对象,默认状态码为200 $response = new Response('Hello ' .$name, 200); //创建一个基于JSON的Response对象,状态码也为200 $response = new Response(json_encode(array('name'=>$name))); $response->headers->set('content-type','application/json');
其中headers属性是一个HeaderBag对象,内部包含许多有用的方法来读取和改变Response的头信息。头名字被标准化使用Content-Type 与content-type或者content_type效果等同。
请求对象Request
除了路由占位符的值以外,如果继承了Controller基类那么该controller还可以访问Request对象。
$request = $this->getRequest(); $request->isXmlHttpRequest(); // 判断是不是Ajax请求 $request->getPreferredLanguage(array('en','fr')); $request->query->get('page'); // 获取$_GET 参数 $request->request->get('page'); //获取$_POST参数
跟Response对象一样,Request对象的头也保存在HeaderBag对象中,可以很方便的被访问。
总结思考:
无论何时,你创建一个页面,你最终需要为它写一些包含逻辑的代码。在Symfony中,这叫一个controller, 它是一个PHP的函数,它可以为了最后返回一个Response对象给用户可以做需要的任何事情。简单的说,你可以选择继承一个Controller基类,它包含了许多执行controller通用任务的快捷方法。比如,你不想把HTML代码写入你的controller, 你可以使用render()方法来渲染并返回一个模板内容。