程序员人生 网站导航

【Chapter 6 Routing】.The Book for Symfony 2.4 第六章 路由(Routing)

栏目:access时间:2014-10-14 12:00:22

       第六章 路由

       漂亮的URL地址对任何重要的网络应用都是绝对必要的。这意味着要抛弃像index.php?article_id=57这样的URL地址,使用一些像/read/intro-to-symfony这样的URL地址。

       更为重要的是灵活性。如果你要改变一个页面的URL地址从/blog/news的话,你将要查找出多少链接,然后再对它们修改呢?

        Symfony2的路由器(router)将让你定义创新的URL地址,可以映射到你的应用的不同区域。本章结束后,你将可以:

? 创建复杂的路由映射到控制器(controllers)
? 在模板和控制器中产生URL地址
? 从bundles中(或者其它任何地方)加载路由资源
? 调试你的路由

Routing in Action

      一个路由(A route)是一个从URL路径到控制器(controller)的映射。例如,假设你想要匹配任何像/blog/my-post或者/blog/all-about-symfony的URL地址,然后再发送它给一个可以查看以及渲染那个博客内容的控制器(controller)。这个路由很简单:

# app/config/routing.yml blog_show: path: /blog/{slug} defaults: { _controller: AcmeBlogBundle:Blog:show }
新特性在2.2版本中:在symfony2.2中path选项是新的,pattern在老版本中使用

       被路由blog_show定义的路径起到像/blog/*的效果,通配符被指定为slug。对于URL/blog/my-blog-post,slug变量获得my-blog-post的值,并且在你的控制器中依然可以继续使用(keep reading)。

    _controller参数是一个特殊键,它告诉Symfony 当一个URL地址匹配这个路由时,哪个控制器(controller)将被执行。_controller字符被称作逻辑名称。它遵守一种指向一个特殊PHP类和方法的模式:

// src/Acme/BlogBundle/Controller/BlogController.php namespace AcmeBlogBundleController; use SymfonyBundleFrameworkBundleControllerController; class BlogController extends Controller { public function showAction($slug) { // use the $slug variable to query the database $blog = ...; return $this->render('AcmeBlogBundle:Blog:show.html.twig', array( 'blog' => $blog, )); } }

       恭喜你!你已经创建了你的第一个路由而且将它连接连接到了一个控制器。现在当你访问/blog/my-post,showAction 控制器将被执行且$slug 变量将和my-post进行比较。

       这是Symfony2 路由器的目标:将一个请求的URL映射到一个控制器。一路上,你将学习多种技巧,即使映射的是最复杂的URL,也可以相当的容易。

Routing: Under the Hood

当你的应用程序被请求,它包含一个指向客户端正在请求的准确资源。这个地址叫做URL地址,可以是/contact,/blog/read-me,或者其它的地址。例如采取以下http请求:

GET /blog/my-blog-post

Symfony2 路由系统的目标是解析URL然后确定哪个控制器将被执行。整个过程看起来像这样:

  1. 通过Symfony2前端控制器(例如app.php)请求被处理。
  2. Symfony2核心(Kernel)请求路由器检查请求。
  3. 路由器匹配传入的URL地址指向一个路由,然后返回关于路由的信息,包括将被执行的控制器。
  4. Symfony2 Kernel 执行控制器,最后返回一个响应对象


The routing layer is a tool that translates the incoming URL into a specific controller to execute.

路由层是一个工具,它转换输入的URL到将要执行的对应控制器。

Creating Routes

Symfony 从一个路由配置文件中为你的应用程序加载所有的路由。路由配置文件常常是app/config/routing.yml,但是通过应用程序配置文件也可以被配置成XML或PHP格式的。

# app/config/config.yml framework: # ... router: { resource: "%kernel.root_dir%/config/routing.yml" }

虽然所有路由从一个单独的文件被加载,但是更普遍的做法是包含额外的路由资源。可以这样做,只要指出了包含了外部文件的主路由配置文件。参考 the Including External Routing Resources 章节以获得更多信息。

Basic Route Configuration

定义一个路由规则很简单,一个标准的应用会有很多的路由规则。一个基本的路由规则仅仅由两部分组成:匹配的路径和默认的数组:

_welcome: path: / defaults: { _controller: AcmeDemoBundle:Main:homepage }

这条路由规则匹配主页(/),映射它到 AcmeDemoBundle:Main:homepage 控制器。_controller 字符被Symfony2转换成一个实际的PHP函数,然后执行。那个过程将在控制器命名模式章节中做简短的解释。

Routing with Placeholders

当然,路由系统支持很多有趣的路由规则。很多路由规则将包含一个或多个被称作通配符的占位符:

blog_show: path: /blog/{slug} defaults: { _controller: AcmeBlogBundle:Blog:show }

路径将匹配任何类似 /blog/* 的地址。更棒的是,和{slug}占位符匹配的值将可以在控制器中使用。换句话说,如果URL地址是 /blog/hello-world,值为hello-world的$slug变量将可以在控制器中使用。例如,这可以被用来加载匹配那个字符的博客文章。路径将不会简单地匹配 /blog。那是因为,默认地,所有占位符是必需的。通过向默认数组添加一个占位符这种情况可以改善。

Required and Optional Placeholders

让事情更加令人激动,为这个虚构的博客应用添加一个新的路由规则,它可以显示所有有效的博客文章列表。

blog: path: /blog defaults: { _controller: AcmeBlogBundle:Blog:index }

到目前为止,这条路由规则是尽可能的简单-它不包含占位符而且只匹配确切的URL地址 /blog。但是如果你需要这条路由规则支持分页该怎么办,以及 /blog/2 在哪里显示第二页的博客实体?更新路由规则使其有一个新的{page}占位符。

blog: path: /blog/{page} defaults: { _controller: AcmeBlogBundle:Blog:index }

像之前的{slug}占位符,{page}匹配的值也可以在你的控制器中使用。它的值被用来确定哪个博客文章集合将显示在给定的页面上。但是等等!因为占位符默认是必须的,这条路由规则将不再简单匹配/blog。反而,要看blog的页面1,你需要使用URL地址 /blog/1 !因为对一个体验良好的网络应用,那样是不行的,所以修改路由规则,使{page}参数是可以选择性的。将它包含在默认集合中,就可以完成。

blog: path: /blog/{page} defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }

通过添加page参数到defaults键,{page}占位符已经不再是必须的了。URL地址 /blog 将匹配这条路由规则而且page参数的值被将会被设置成1。 URL地址 /blog/2 也将匹配,赋予page参数值为2。完美!

URL
route parameters
/blog
blog {page} = 1
/blog/1 blog {page} = 1
/blog/2 blog {page} = 2

当然,你可以使用不止一个可选的占位符(例如 /blog/{slug}/{page}),但是可选择的占位符后面也必须是可选择的。例如 /{page}/blog 是一个不合法的路径,但是页面将总是必须的。(/blog将不会被这条路由匹配)

后面是可选参数的路由规则将不会匹配结尾是反斜杠的请求。(例如/blog/不会匹配,/blog会匹配)




------分隔线----------------------------
------分隔线----------------------------

最新技术推荐