一个控制器就是一个你自定义的PHP函数, 它用来从Symfony的Request对象中读取信息, 返回一个创建的Response对象. 可以响应html内容, json, xml, 一个下载文件, 一个302重定向, 一个404错误, 任何你可以想到的东西都行. 控制器可以执行任意的, 你的应用需要渲染的内容逻辑.
我们来看看Symfony控制器有多简单. 以下这段程序就是在页面上显示一个随机数字:
// src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
/**
* @Route("/lucky/number")
*/
public function numberAction()
{
$number = mt_rand(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
但是在真实的应用场景中, 控制器可能会做一系列的动作来创建一个response对象. 这些动作可能是从request对象中读点数据, 从数据库中读点数据, 发送个邮件, 或者在session中存点东西. 但是在所有的场景中, 控制器最终都会返回一个response对象, 然后把它发送给客户端.
一个简单的控制器
当然了, 控制器可以是任何PHP中的callable, (一个函数, 一个对象的方法, 或者一个闭包), 一个控制器通常来说是一个类中的方法.
// src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class LuckyController
{
/**
* @Route("/lucky/number/{max}")
*/
public function numberAction($max)
{
$number = mt_rand(0, $max);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
这个时候,控制器就是numberAction()
方法了, 它被放在LuckyController
控制器中.
这个控制器的作用一目了然:
- 第二行: Symfony 利用了PHP中命名空间的优势, 去给控制器类命名
- 第四行: Symfony又利用了PHP命令空间的优势, 使用
use
关键词来导入Response
类 - 第七行: 随便你怎么命名, 但是必须以
Controller
结尾. (这虽然不是必要的, 但一些快捷方式依赖这个) - 第十二行: 所有控制器类中的action方法都必须以
Action
为后缀 (也不是必须的, 但一些快捷方式依赖这个). - 第十六行: 控制器类创建及返回一个
Response
对象.
映射URL到控制器
为了看到控制器的结果, 需要增加一条路由, 把URL映射到控制器. 这是由上面的注释 @Route("/lucky/number/{max}")
完成的.
访问以下URL来访问页面:
基本控制器类和服务
为了方便, Symfony自带一个可选的基类 Controller
. 如果你继承它, 这不会改变任何你的控制器, 而且你可以使用一些帮助函数和服务容器, 服务容器就是一个像数组的对象, 可以让你在系统中使用一些非常有用的对象. 这些非常有用的对象叫做服务. Symfony通过这些服务对象来渲染Twig模板, 还有一些来记录日志.
在文件上面使用use
来导入Controller
, 然后继承它.
// src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class LuckyController extends Controller
{
// ...
}