Symfony2学习笔记之系统路由详解
|
本文详细讲述了Symfony2的系统路由。分享给大家供大家参考,具体如下: 漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/intro-to-symfony 来替代。 拥有灵活性更为重要,如果你要改变一个页面的URL,比如从/blog 到 /new 怎么办? 有多少链接需要你找出来并更新呢? 如果你使用Symfony的router,这种改变将变得很简单。 Symfony2 router让你定义更具创造力的URL,你可以map你的应用程序的不同区域。 创建复杂的路由并map到controllers并可以在模板和controllers内部生成URLs 从bundles(或者其他任何地方)加载路由资源 调试你的路由 路由活动一个路径是一个从URL 模式到一个controller的绑定。 比如假设你想匹配任何像 /blog/my-post 或者 /blog/all-about-symfony的路径并把它们发送到一个controller在那里可以查找并渲染blog实体。 该路径很简单: YAML格式: XML格式: PHP代码格式: add('blog_show',new Route('/blog/{slug}',array(
'_controller' => 'AcmeBlogBundle:Blog:show',)));
blog_show路径定义了一个URL模式,它像/blog/* 这里的通配符被命名为slug。对于URL/blog/my-blog-post,slug变量会得到值 my-blog-post。 _controller参数是一个特定的键,它告诉Symfogy当一个URL匹配这个路径时哪个controller将要被执行。 _controller字符串被称为逻辑名。它的值会按照特定的模式来指定具体的PHP类和方法。 render('AcmeBlogBundle:Blog:show.html.twig',array(
'blog' => $blog,));
}
}
现在当你再访问/blog/my-post 时,showAction controller将被执行并且$slug变量的值为my-post Symfogy2 的路由器目标:映射一个请求的URL到controller。 路由:内部的秘密当一个请求发送到应用程序时,它包含一个客户端想要获取资源的地址。这个地址叫做URL或者URI。可能是/contact,/blog/read-me或者其它样式。 GET /blog/my-blog-post Symfony2 路由系统的目标是解析这些URL并决定哪个controller应该被执行来回复该请求。 整个路由过程可以分为: 1.请求被Symfony2的前端控制器(app.php)处理。 2.Symfony2核心(kernel)要求路由器检查请求。 3.路由器匹配接收到的URL到一个特定的路径并返回有关信息,包括应该被执行的controller。 4.Symfony2核心执行该controller,该controller最终会返回一个Response对象。 路由器层就是一个把接收到的URL转换为要执行的特定controller的工具。 创建路由Symfony会从一个单独的路由配置文件中加载你应用程序的所有路由。该文件通常为 app/config/routing.yml。 它可以被配置成包括XML或者PHP文件等文件。 YAML格式: XML格式: PHP代码格式: loadFromExtension('framework',array(
// ...
'router' => array('resource' => '%kernel.root_dir%/config/routing.php'),));
基础路由配置定义一个路由很简单,通常一个应用程序拥有很多路由。一个基础路由是由两部分组成:pattern部分和defaults数组部分。 比如: YAML格式: XML格式: PHP代码格式: add('_welcome',new Route('/',array( '_controller' => 'AcmeDemoBundle:Main:homepage',))); return $collection;该路由匹配首页(/)并映射到AcmeDemoBundle:Main:homepage controller。_controller字符串被Symfony2翻译成一个相应的PHP函数并被执行。 带占位符路由当然,路由系统支持更多有趣的路由。许多路由会包含一个或者多个被命名的通配符占位符。 YAML格式: XML格式: PHP代码格式: add('blog_show',array( '_controller' => 'AcmeBlogBundle:Blog:show',))); return $collection;该模式将匹配任何类似/blog/*形式的URL。匹配占位符{slug}的值将会在controller中被使用。换句话说,如果URL是/blog/hello-world,则$slug变量值是hello-world, 该值将能在controller中被使用。该模式不会匹配像/blog,因为默认情况下所有的占位符都是必须的。 当然可以通过在defaults数组中给这些占位符赋来改变它。 必需和可选占位符我们来添加一个新的路由,显示所有可用的blog列表。 YAML格式: XML格式: PHP代码格式: add('blog',new Route('/blog',array( '_controller' => 'AcmeBlogBundle:Blog:index',))); return $collection;到目前为止,我们的路由都是非常简单的路由模式。它们包含的非占位符将会被精确匹配。 如果你想该路由能够支持分页,比如让/blog/2 显示第二页的blog,那就需要为之前的路由添加一个新的{page}占位符。 YAML格式: XML格式: PHP代码格式: add('blog',new Route('/blog/{page}',))); return $collection;跟之前的{slug}占位符一样{page}占位符将会在你的controller内部可用,它的值可以用于表示要显示的blog值的页码。但是要清楚,因为占位符默认情况下都是必需的,该路由也将不再匹配之前的/blog URL,这时候你如果还像看第一页的话,就必须通过/blog/1 URL来访问了。要解决该问题,可以在该路由的defaults数组中指定{page}的默认值。 YAML格式: XML格式: PHP代码格式: add('blog','page' => 1,))); return $collection;通过添加page到defaults键, {page}占位符就不再是必需的。这时候 /blog将会被匹配并且page参数被设置为1,URL /blog/2 也会被匹配。 添加要求约束看看下面这些路由: YAML格式: (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
