参考官方文档:http: //symfony.com/doc/current/book/routing.html
http: //symfony.com/doc/current/book/controller.html
(一)整体认识
先看symfony下的一个完整示例:(来自官方的Book)
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class BlogController extends Controller
{
/**
* @Route("/blog/{slug}", name="blog_show")
*/
public function showAction($slug)
{
return new Response($slug);
}
}
一个Controller类可以不继承Controller。但
仅在继承Controller时才能够使用symfony内的模板对网页进行渲染。关于模板的使用见官方教程的第七章:
Creating and Using templates
(1). Header部分:
如果要继承Controller,需要在代码开头处加上:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
在使用Response类时,需加上:
use Symfony\Component\HttpFoundation\Response;
在使用 JsonResponse类时,需加上:
use Symfony\Component\HttpFoundation\JsonResponse;
使用路由机制时应加上:(一般都有)
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
(2). 类部分:
class BlogController extends Controller
{
/**
* @Route("/blog/{slug}", name="blog_show")
*/
public function showAction($slug)
{
return new Response($slug);
}
}
这部分是一个设定好的路由机制:
/**
* @Route("/blog/{slug}", name="blog_show")
*/
name属性的值决定了该条路由的名字,起类似ID的标记作用。
{ slug }部分是一个变量,将作为参数传入下面的Action函数进行处理。
这里是一个Action函数,按照开发要求实现具体的功能:
public function showAction($slug)
{
return new Response($slug);
}
该控制器的最终功能: 将URL为:localhost/ blog/whatever 中的 whatever传 入showAction函数进行处理, 然后whatever作为响应打印在页面上。
symfony处理请求的逻辑流:(图来自于官网)
下面分别学习Routing和Controller。
(二)路由机制 (Routing)
1. 路由是做什么的 ?
由官方文档的 原句: Therouting layer is a tool that translates the incoming URL into a specific controller to execute.
从中可以看出路由的功能: 将一个特定URL交给一个特定的控制器进行处理。这里的控制器即一个类,类中包括具体的php函数(这里称之为动作,即Action)。
2. 如何使用路由机制?
路由的语法: 基本是 path + attributes
path(路径): 由斜线与字符串构成,中间可以有多个变量,每个变量由一对花括号标识出。
attributes(属性):
属性名 | 含义 | 用法 |
defaults | 设置变量的默认值,构成默认的URL路径。 | defaults = {”变量名1“ = ”默认值1“, ...} |
requirements | 给变量加上限制条件,往往出于合法性的要求。 | requirements = {”变量名1“ = ”正则表达式1“, ......} |
位置通常是在Action函数之上:
/**
* @Route("/blog/{slug}", _attrib ="_value")
*/
对于属性的使用的示例:
(1). 用defualts来设置默认路径:
/**
* @Route("/blog/{page}", defaults={"page" = 1})
*/
这时若访问 /blog 等同于访问 /blog/1 , 若没有设定defaults值时,试图访问/blog 是非法的。
(1). 用requirements来限制变量取值:
/**
* @Route(
* "/articles/{_locale}/{year}/{title}.{_format}",
* defaults={"_format": "html"},
* requirements={
* "_locale": "en|fr", // _locale的取值范围为"en"或者"fr"
* "_format": "html|rss", // _format的取值范围为"html"或者"rss"
* "year": "\d+" // year的取值范围为整数
* }
* )
*/
3. 一些特别的用法:
可以利用@Method指定不同类型的http请求由不同控制器进行处理。写法为: @Method({"method"})
示例程序:
/**
* @Route("/api/posts/{id}")
* @Method({"GET","HEAD"})
*/
4. 路由信息管理&调试方法:
通过命令 $ php bin/console debug:router 可以查看当前已有的路由名字与URL的对应情况。
可以指定某一路由名查看相应的信息 : $ php bin/console debug:router article_show
<pre name="code" class="php">也可以根据URL反查是否有对应的路由: $ php bin/console router:match /blog/my-latest-post
5. 最后是关于生成URL的部分内容, 官方文档总结得很清楚,可以在用到的时候查看官方文档。
(三)控制器 (Controller)
1. 什么是控制器?
Acontroller is a PHP callable you create that takes information from the HTTP request and creates and returns an HTTP response (as a Symfony Response
object).
symfony这里的控制器实际上指的是我们要完成的action函数(并非控制器类),而action函数一般会放在一个Controller类里。一开始有点混淆控制器和控制器类的概念了。 注意控制器 ≠ 控制器类! 这里所指的控制器也并非在请求流图中见到的前端控制器。前端控制器是在 /web 下的很短的php代码,用于引导所有的请求。我们不需要对前端控制器做任何编辑。
2. 控制器的特点
(1). 一个控制器类中可以有多个控制器(Action函数)
(2). 控制器参数的顺序改变对控制器的功能没有影响。
(3). 控制器的每一个所需参数都必须能找到对应的路由参数。
(4). 控制器的参数可以比路由参数少。(仅用部分参数)
3. 通过继承Controller来获取symfony提供的服务
可通过get( ) 方法获取服务:
$templating = $this->get('templating');
$router = $this->get('router');
$mailer = $this->get('mailer');
使用debug:container
控制台命令获得所有的服务列表:
$ php bin/console debug:container
4. 多种应用:(官方文档总结得很清晰,随用随查)
(1). 异常的抛出与处理(404页面)
(2). 一闪而过的页面的实现(Flash Messages)
5. 创建请求对象
官方示例:
use Symfony\Component\HttpFoundation\Response;
// create a simple Response with a 200 status code (the default)
$response = new Response('Hello '.$name, Response::HTTP_OK);
// create a JSON-response with a 200 status code
$response = new Response(json_encode(array('name' => $name)));
$response->headers->set('Content-Type', 'application/json');