php\symfony3 学习记录(三) 路由和控制器

来源:互联网 发布:hadoop 数据抓取 编辑:程序博客网 时间:2024/05/24 04:16

参考官方文档: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处理请求的逻辑流:(图来自于官网)



下面分别学习RoutingController


(二)路由机制 (Routing)


1.  路由是做什么的 ?

  由官方文档的 原句:  Therouting layer is a tool that translates the incoming URL intoa 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');

0 0