没有合适的资源?快使用搜索试试~ 我知道了~
第09章 链接和路由系统1
需积分: 0 0 下载量 37 浏览量
2022-08-03
22:00:45
上传
评论
收藏 189KB PDF 举报
温馨提示
试读
21页
第 9 章 - 链接和路由系统链接和 URL 在 web 应用程序框架中需要特别关注。因为这是应用程序的唯一进入点(前端控制器);在模板中使用辅助函数可以让 U
资源详情
资源评论
资源推荐
如果
1uo1n
111111111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
第 9 章 - 链接和路由系统
链接和 URL 在 web 应用程序框架中需要特别关注。因为这是应用程序的唯一进
入点(前端控制器);在模板中使用辅助函数可以让 URL 工作方式和他们的外
观完全分离。这就叫做路由。路由可以使建立的应用程序对用户更友好更安全。
本章会讲述在 symfony 应用程序里处理 URL 所需要了解的内容:
• 什么是路由系统及它是如何工作的
• 如何在模板中使用链接辅助函数让路由处理外部 URL
• 如何配置路由规则来改变 URL 的组成
你还会找到一些控制路由的性能和增加 最后的修饰小技巧。
什么是路由?
路由是一种为了显示更友好的 URL 而重写 URL 的机制。但要去了解他为何如此
重要的之前,先需要花几分钟来理解什么是 URL。
URL 是服务器指令
URL 包含了从浏览器到服务器用来请求执行一个用户需求行为的信息。例如,
一个传统的 URL 包含了脚本文件路径和一些请求所必要的参数,就像下面这个
例子:
http://www.example.com/web/controller/article.php?
id=123456&format_code=6532
这个 URL 显示了关于应用程序结构和数据库的信息。开发者通常在界面里隐藏
了应用程序的架构(例如,他们设置页标题“个人资料页”而不是
“QZ7.65”)。应用程序内部重要信息的泄露是违背 URL 本意的,并会带来严
重弊端:
• 技术数据出现在 URL 中会造成潜在的安全隐患。在前面的例子中,如果
一个不怀好意的用户更改了 id 参数的值会发生什么呢?这是否意味着应
用程序可以提供一个直接访问数据库的方法?或者要是用户为了好玩而
尝试其他脚本名字,例如 admin.php? 总而言之,原始的 URL 会让黑客轻
易的破坏你的应用程序,这样无法进行安全控管。
• 不管在哪里出现费解的 URL 都会让人不安,他们会弱化内容的效果。如
今,URL 不止出现在地址栏里。当用户把鼠标悬停在链接上,或者在搜
索结果中也会出现。当用户要查找信息时,他们希望得到的反馈是易于
理解的,而不是如图 9-1 所示的混乱的 URL。
图 9-1 - URL 在很多地方显示,例如在搜索结果中
• 如果一条 URL 必须被改变(例如,如果脚本名或者它的一个参数需要改
变),每一个链接到它的 URL 都要相应的更改。这就意味着修改控制结
构是非常累人的和昂贵的,这不符合理想的敏捷开发。
如果 symfony 不使用前端控制器概念也许会变得更糟,更确切地说,如果应用
程序包含了许多可以从 Internet 访问的脚本,在许多目录中,就如这些:
http://www.example.com/web/gallery/album.php?name=my%20holidays
http://www.example.com/web/weblog/public/post/list.php
http://www.example.com/web/general/content/page.php?name=about%20us
在这种情况下,开发者需要用文件结构来匹配 URL 结构,结果就会导致当结构
改变的时候,维护将会非常困难。
URL 是界面的一部分
路由概念还有一层含义就是把 URL 看作界面的一部分。应用程序可以通过格式
化的 URL 带给用户信息,用户也可以使用 URL 来访问应用程序的资源。
Symfonysymfony
应用程序中这是可能实现的,因为展示给最终用户的 URL 与执
行请求需要的服务器指令完全无关。相反,它涉及到资源的需求,并且他们可
以自由的格式化。例如,symfony 可以理解下面的 URL 并使其显示和本章第一个
URL 同样的页面:
http://www.example.com/articles/finance/2006/activity-breakdown.html
这样有很大的优势:
• URL 实际上没有意义,但他们可以帮助用户来决定连接后的页面是否有
他们期待的内容。一个连接能包含关于它所返回资源的额外细节。这对
搜索引擎结果特别有用。此外,URL 有时候不会随着页面标题出现(试
想在 email 里复制 URL),在这种情况下,你必须让它有一些含义。图
9-2 就是一个有意义的 URL 的例子。
图 9-2 URL 能传达关于页面的额外信息,如发布日期
• 在纸上的 URL 会更容易输入和记住。如果你的公司网站在你的名片上写
了 http://www.example.com/controller/web/index.jsp?id=ERD4,这
也许不会带来很多的访问者。
• URL 本身可以成为一个命令行工具去执行命令或者获得信息。应用程序
给高级用户提供了这种可以更快捷的可能性。
// 结果列表:新增一个新的 tag 来限制结果列表
http://del.icio.us/tag/symfony+ajax
// 用户信息页:改变用户名来获得其他用户的信息
http://www.askeet.com/user/francois
• 只要用一个简单的修改就能改变 URL 格式和动作名/参数。这就意味着你
可以先开发程序,然后再确定 URL 格式,而不会把应用程序搞得一团糟。
• 甚至在你重组应用程序内部时,对外的 URL 依旧保持原样。这就可以使
动态页面 URL 可以被收藏了。
• 搜索引擎在索引网站时倾向于忽略动态页面(结尾是.php,.asp 之类)。
所以格式化后的 URL 可以让搜索引擎认为是静态的内容,尽管实际上是
动态的页面,因此就能更好的索引你的应用程序页面。
• 这会更安全。用户不能通过测试 URL 来浏览网页根文件结构,任何不能
识别的 URL 会转向到一个开发者指定的页面,请求呼叫实际的脚本和它
的参数都是隐藏的。
用户访问的 URL 和实际的脚本名和请求的参数都是由路由系统根据在配置文件
中定义的规则来转义的。
NOTE 网页资源文件怎么办? 幸运的是, 网页资源文件的 URL (图片、样式表和
JavaScript)在浏览中不会出现很多, 所以不需要对它们设置路由。在 symfony
中,所有的网页资源文件都位于 web/目录下,他们的 URL 对应了他们在文件系
统中的位置。然后,你能使用网页资源文件辅助函数来生成 URL 去控制动态网
页资源(通过动作)。例如,要显示一个动态生成的图片,使用
image_tag(url_for('captcha/image?key='.$key))。
它是如何工作的
Symfonysymfony
把外部 URL 和内部 URL 分离了。他们之间的联系是由路由系统
定义的。为了简化处理,symfony 为内部 URL 使用了和通用 URL 相似的语法。例
9-1 是一个示例:
例 9-1 - 外部 URL 和内部 URL
// 内部 URL 语法
<module>/<action>[?param1=value1][¶m2=value2][¶m3=value3]...
// 内部 URL 示例,永远不会让最终用户看到
article/permalink?year=2006&subject=finance&title=activity-breakdown
// 外部 URL 示例, 显示给最终用户看的
http://www.example.com/articles/finance/2006/activity-breakdown.html
路由系统使用了一个特殊的配置文件 routing.yml 来定义路由规则。看一下例
9-2 所示的规则,它定义了用来把显示内容转换为 articles/*/*/*的模式。
例 9-2 一个路由规则示例
article_by_title:
url: articles/:subject/:year/:title.html
param: { module: article, action: permalink }
每一个发送给 symfony 应用程序的请求首先会被路由系统分析(这很方便,因
为每一个请求都由一个前端控制器来处理)。路由系统在请求 URL 和路由系统
定义的规则模式中寻找匹配规则。如果匹配,通配符的名字变成请求的参数,
并被合并为 param:定义的关键字。例 9-3 显示了它是如何工作的。
例 9-3 - 路由系统解释输入的请求 URL
// 用户输入(或点击)这个外部 URL
http://www.example.com/articles/finance/2006/activity-breakdown.html
// 前端控制器确认它和 article_by_title 规则匹配
// 路由系统建立了以下请求参数
'module' => 'article'
'action' => 'permalink'
'subject' => 'finance'
'year' => '2006'
'title' => 'activity-breakdown'
TIP 外部 URL 的.html 扩展名只是一个简单的装饰,会被路由系统忽略掉。他
只是让动态页面看上去和静态页面一样。你会在本章稍后的“路由配置”部分
看到如何激活这个扩展。
接下来请求会传递给 article 模块的 permalink 动作,它用所有请求参数中的
请求信息来决定显示哪个文章。
但是这个机制也能反向工作。为了让应用程序在自己的链接中显示外部 URL,
你必须提供给路由系统足够的数据让它确定使用哪个规则。你可以通过一个特
剩余20页未读,继续阅读
那你干哈
- 粉丝: 28
- 资源: 289
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0