第九章——链接和路由系统
链接和网址值得特殊治疗在一个web应用程序框架。这是因为应用程序的唯一入口点(前端控制器)和在模板中使用助手允许一个完整的url的工作方式之间的分离和外表。这被称为路由。小玩意,路由是一个有用的工具,使web应用程序更加用户友好的和安全的。本章将告诉你所有你需要知道的处理url在symfony应用程序:ob娱乐下载
- 路由系统是什么和它是如何工作的
- 如何使用链接模板启用路由的助手即将离任的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不仅出现在地址栏。当用户将鼠标悬停于鼠标出现在一个链接,在搜索结果中。当用户寻找信息,你想给他们容易理解的关于他们发现线索,而不是一个令人困惑的URL,如图9所示。
图9 - url出现在许多地方,如在搜索结果中
- 如果一个URL必须改变(例如,如果一个脚本的名字或者它的一个参数修改),每一个链接到这个URL必须改变。这意味着修改控制器结构是重量级的,昂贵的,在敏捷开发并不理想。
它可能会更糟,如果symfony不使用前端控制器模式;ob娱乐下载也就是说,如果应用程序包含许多脚本从因特网访问,在许多目录,诸如此类的:
http://www.example.com/web/gallery/album.php?name =我的假期% 20 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来访问应用程序的资源。
在symfony应用程序中这是可能的,因ob娱乐下载为URL提交给最终用户向服务器无关指令需要执行请求。相反,它是相关的资源请求,它可以自由地进行格式化。例如,symfony可以理解ob娱乐下载下面的URL和它同一页面显示为第一个URL本章所示:
http://www.example.com/articles/finance/2010/activity-breakdown.html
带来的好处是巨大的:
- url实际上意味着什么,他们可以帮助用户决定如果后面的页面链接包含他们期望什么。一个链接可以返回包含额外的信息资源。这是特别有用的搜索引擎结果。此外,有时出现网址没有提到页面标题(想想当你复制一个URL在一封电子邮件),在这种情况下,他们必须自己意味着什么。参见图以一个用户友好的URL。
- 技术实现对用户隐藏:他们不知道使用脚本,他们不能想一个
id
或类似的参数:应用程序不太容易一个潜在的安全漏洞。,你能完全改变幕后发生的事情,而不影响他们的经验(他们不会有一个404错误或永久重定向)。
图以9 - url可以传达更多的信息页面,出版日期
- 网址写在文件类型更容易记住。如果你的公司网站出现
http://www.example.com/controller/web/index.jsp?id=ERD4
你的名片,它可能不会收到许多访问。 URL可以成为自己的一个命令行工具,以直观的方式执行操作或检索信息。应用程序提供了这种可能性更快为高级用户使用。
/ /结果列表:添加一个新的标签缩小结果列表http://del.icio。我们/标签/ ob娱乐下载symfony + ajax / /用户个人信息页面:http://www.askeet.com/user/francois改名为得到另一个用户配置文件
你可以改变URL格式和操作名称/独立参数,用一个修改。这意味着您可以开发第一,和格式的url之后,完全没有把您的应用程序。
- 即使当你重组的内部应用程序中,url可以为外部世界保持不变。它使url持久,这是必须的,因为它允许动态页面的书签。
- 搜索引擎会跳过动态页面(结束
. php
,asp
索引网站时,等等)。所以你可以格式的url搜索引擎认为他们浏览的静态内容,即使当他们遇到一个动态页面,从而导致更好的应用程序的索引页面。 - 它是更安全。任何未被指定的URL将被重定向到一个页面开发人员,和用户无法浏览网页根文件结构通过测试URL。实际的脚本名称调用请求,以及它的参数,是隐藏的。
url之间的通信提供给用户和实际的脚本名称和请求参数是通过路由系统,基于模式,可以通过修改配置。
请注意
资产呢?幸运的是,资产的url(图像、样式表和JavaScript)不要出现在浏览,所以没有真正需要的路由。在syob娱乐下载mfony中,所有资产位于下web /
目录,和他们的URL匹配位置的文件系统。然而,您可以管理动态资产(由操作)通过使用生成的URL内部资产的助手。例如,显示一个动态生成的图像,使用image_tag (url_for('验证码/形象?关键= '键)美元。)
。
它是如何工作的
ob娱乐下载Symfony断开外部URL和其内部的URI。两者之间的通信是由路由系统。使事情容易,symfony使用uri语法内ob娱乐下载部非常类似于一个普通的url。清单9显示了一个例子。
清单9 -外部URL和内部URI
/ /内部URI语法<模块> / <行动> [? param1 = value1] [¶m2 = value2] [¶m3 = value3]…/ /例子内部URI,它从未似乎最终用户文章/永久链接吗?= 2010年主题= finance&title = activity-breakdown / /外部URL示例,这似乎最终用户http://www.example.com/articles/finance/2010/activity-breakdown.html
路由系统使用一个特殊的配置文件,调用routing.yml
,您可以在其中定义路由规则。考虑清单以9中所示的规则。它定义了一个模式看起来像文章/ * / * / *
和名称的内容匹配通配符。
样品清单以9 -路由规则
article_by_title: url:文章/主题/:/:标题。html参数:{模块:文章中,行动:永久链接}
每个请求发送到一个symfony应用程序是首先分ob娱乐下载析了路由系统(这很简单,因为每个请求都是由一个前端控制器)。之间的路由系统查找匹配请求URL和路由规则中定义的模式。如果找到匹配,名叫通配符成为请求参数和合并中定义的参数:
关键。清单9 - 3中看到它是如何工作的。
清单9 - 3 -路由系统将传入请求的url
/ /用户类型(或点击)这个外部URL http://www.example.com/articles/finance/2010/activity-breakdown.html / /前端控制器看到它匹配article_by_title规则/ /路由系统创建以下请求参数“模块”= >“文章”“行动”= >“永久链接”“主题”= >“金融”“年”= >“2010”“标题”= >“activity-breakdown”
然后传递给请求永久链接
行动的文章
模块,请求参数中的所有必需的信息,以确定哪些文章是被显示。
但机制也必须工作。为应用程序显示外部url的链接,你必须为路由系统提供足够的数据来确定哪些规则适用于它。你也不能超链接直接与写<一>
标签——这完全绕过路由——但是特别助手,见清单蓝鸟队。
清单蓝鸟队——即将离任的url路由系统格式的模板
/ / url_for()辅助内部URI转换为外部URL< a href =“< ?php echo url_for(“文章/永久链接? = finance&year = 2010主题标题= activity-breakdown ') ? > ">请点击这里< / >/ /辅助发现URI匹配article_by_title规则/ /路由系统创建了一个外部URL= > < a href =“http://www.example.com/articles/finance/2010/activity-breakdown.html”>请点击这里< / >/ / link_to()辅助直接输出一个超链接/ /并避免混合PHP和HTML< ? php回声link_to(“点击这里”,的文章/永久链接?主题= finance&year = 2010标题= activity-breakdown ')? >/ /内部,link_to()将调用url_for()结果是相同的= > < a href =“http://www.example.com/articles/finance/2010/activity-breakdown.html”>请点击这里< / >
路由是一种双向机制,只有如果你使用工作link_to ()
辅助格式所有链接。
URL重写
之前入更深的路由系统,一个需要澄清的问题。在前一节中给出的示例中,没有提到前端控制器(index . php
或frontend_dev.php
)内部uri。前端控制器,而不是应用程序的元素,决定了环境。所有的链接必须是独立于环境,和前端控制器名称不能出现在内部的uri。
没有脚本名生成的url的例子。这是因为生成的url不包含任何脚本的名字默认在生产环境中。的no_script_name
参数的settings.yml
文件精确控制前端控制器的出现在生成的url。将其设置为假
如清单9 - 5所示,url链接输出的助手将在每一个环节提前端控制器脚本的名字。
清单9 - 5 -显示在url,前端控制器的名字应用程序/前端/ config / settings.yml
刺激:.settings no_script_name:假的
现在,生成的url将是这样的:
http://www.example.com/index.php/articles/finance/2010/activity-breakdown.html
在所有环境中除了生产,no_script_name
参数设置为假
默认情况下。所以当你浏览您的应用程序在开发环境中,例如,前端控制器的名字总是出现在url。
http://www.example.com/frontend_dev.php/articles/finance/2010/activity-breakdown.html
在生产中,no_script_name
被设置为真正的
,所以只显示url路由信息和更友好。没有出现技术信息。
http://www.example.com/articles/finance/2010/activity-breakdown.html
但应用程序如何知道前端控制器脚本调用哪一个?这就是URL重写。web服务器可以配置为给定的脚本调用时没有在URL中。
在Apache中,这是可能的,一旦你有了mod_rewrite
扩展激活。每一个symob娱乐下载fony项目有一个. htaccess
文件,它增加了mod_rewrite
设置您的服务器配置web /
目录中。这个文件的默认内容见清单因。
Apache清单因违约重写规则,myproject / web / . htaccess
< IfModule mod_rewrite。c > RewriteEngine #取消注释以下行,如果你是很难得到no_script_name # # RewriteBase / #我们跳过所有文件,# RewriteCond % {REQUEST_URI} \ . .+ $ # RewriteCond % {REQUEST_URI} ! \。html $ # RewriteRule。* - [L] #我们这里检查html版本(缓存)RewriteRule ^美元指数。html (QSA) RewriteRule ^ ([^] +) $ $ 1。html (QSA) RewriteCond % {REQUEST_FILENAME} ! - f #不,我们重定向到前面web控制器RewriteRule ^(. *)美元指数。php (QSA L) < / IfModule >
web服务器检查接收到的url的形状。如果URL不包含后缀(默认注释掉了),如果没有缓存版本可用的页面(第十二章涵盖了缓存),然后将请求提交index . php
。
然而,web /
目录的一个symfony项目之ob娱乐下载间共享的所有应用程序和环境项目。这意味着通常有不止一个前端控制器在web目录。例如,一个项目有一个前端
和一个后端
应用程序,dev
和刺激
在环境中,包含四个前端控制器脚本web /
目录:
index . php// frontend in prod frontend_dev.php // frontend in dev backend.php // backend in prod backend_dev.php // backend in dev
的mod_rewrite
设置只能指定一个默认的脚本名称。如果你设置no_script_name
来真正的
所有的应用程序和环境中,所有url将被解释为要求前端
应用程序的刺激
环境。这就是为什么你可以只有一个应用程序和一个环境利用URL重写的对于一个给定的项目。
提示
有一种方法可以有多个应用程序,没有脚本名称。创建子目录的web根,前端控制器里面移动。改变的路径ProjectConfiguration
相应的文件,并创建. htaccess
URL重写配置,您需要为每个应用程序。
链接助手
由于路由系统,您应该使用链接帮手,而不是常规<一>
在你的模板标签。不要看这是一个麻烦,而是为契机,保持应用程序清洁且易于维护。此外,链接帮手提供一些非常有用的快捷键,你不想错过。
超链接、按钮和形式
你已经知道link_to ()
帮手。它输出一个xhtml链接,预计两个参数:元素,可以点击和内部的URI的资源点。而不是一个超链接,如果你想要一个按钮,使用button_to ()
帮手。形式也有辅助管理的价值行动
属性。你会了解更多关于形式在下一章。清单9-7显示了一些示例的链接帮手。
清单9-7 -链接帮手<一>
,<输入>
,<形式>
标签
/ /链接在一个字符串< ? php回声link_to(“我的文章”,“= Finance_in_France文章/读?”)? >= > < a href =“/路由/ url / / Finance_in_France”>我的文章< / >/ /对图像超链接< ? php回声link_to(image_tag(“read.gif”),“= Finance_in_France文章/读?”)? >= > < a href =“/路由/ url / / Finance_in_France”> < img src =“遗产/图片/ read.gif”/ > < / >/ /按钮标签< ? php回声button_to(“我的文章”,“= Finance_in_France文章/读?”)? >= > <输入值=“我的文章”类型=“按钮”onclick =“document.location.href = /路由/ url / / Finance_in_France”;“/ >/ /表单标签< ? php回声form_tag(“= Finance_in_France文章/读?”)? >= = > <形式方法“职位”action =“/路由/ url / / Finance_in_France”/ >
链接助手可以接受内部uri以及绝对url(开始http://
,跳过路由系统)和锚。注意,在真实的应用程序中,内部uri是建立与动态参数。清单9显示了所有这些案件的例子。
清单9 - url链接助手所接受
/ /内部URI< ? php回声link_to(“我的文章”,“= Finance_in_France文章/读?”)? >= > < a href =“/路由/ url / / Finance_in_France”>我的文章< / >/ /内部URI与动态参数< ? php回声link_to(“我的文章”,“= /读条吗?”。美元的文章- >getTitle())? >/ /内部与锚URI< ? php回声link_to(“我的文章”,/读条?标题= Finance_in_France # foo ')? >= > < a href =“/ / url路由到/ Finance_in_France # foo”>我的文章< / >/ /绝对URL< ? php回声link_to(“我的文章”,“http://www.example.com/foobar.html”)? >= > < a href =“http://www.example.com/foobar.html”>我的文章< / >
链接帮助选项
第七章中解释说,助手接受额外的选项参数,可以关联数组或字符串。这适用于链接帮手,清单9-9所示。
清单9-9 -链接助手接受额外的选项
/ /附加选项作为一个关联数组中< ? php回声link_to(“我的文章”,“= Finance_in_France文章/读?”,数组(“类”= >“foobar”,“目标”= >“平等”))? >/ /附加选项作为字符串(相同的结果)< ? php回声link_to(“我的文章”,“= Finance_in_France文章/读?”,“阶级= foobar目标=平等”)? >= > < a href =“/路由/ url / / Finance_in_France”类=“foobar”目标=“平等”>我的文章< / >
您还可以添加链接助手symfony-specific选项ob娱乐下载之一:确认
和弹出
。第一个显示一个JavaScript确认对话框点击链接时,第二个在一个新的窗口打开链接,如清单9所示。
清单9 -“确认”
和“弹出”
选择链接助手
< ? php回声link_to(“delete item”,“项目/删除? id = 123”,“确认=你确定吗?”)? >= > < onclick =“返回确认(“你确定吗?”);“href =“/ / url路由/ html /删除/ 123.”> < / >删除项< ? php回声link_to(“加入购物车”,“shoppingCart /添加? id = 100”,“弹出= true”)? >= > < onclick =“window.open (this.href);返回false;“href =“/ fo_dev.php / shoppingCart /添加html / id / 100.”< / > >添加到购物车< ? php回声link_to(“加入购物车”,“shoppingCart /添加? id = 100”,数组(“弹出”= >数组(“popupWindow”,'宽度= 310,高度= 400 = 320,最高= 0的)))? >= > < onclick =“window.open(这一点。href,“popupWindow”,'宽度= 310,高度= 400 = 320,最高= 0的);return false;"href =“/ fo_dev.php / shoppingCart /添加html / id / 100.”< / > >添加到购物车
这些选项可以组合。
假的GET和POST方法
有时web开发人员使用GET请求做一篇。例如,考虑下面的网址:
http://www.example.com/index.php/shopping_cart/add/id/100
这个请求会改变应用程序中包含的数据,通过将一个条目添加到购物车对象,存储在会话或在数据库中。这个URL可以书签、缓存和索引的搜索引擎。想象所有的事情可能发生在数据库或一个网站使用这种技术的指标。事实上,这个请求应该被认为是一篇文章,因为搜索引擎机器人不做索引的POST请求。
ob娱乐下载Symfony提供了一种方法将调用link_to ()
或button_to ()
助手到一个实际的职位。只是添加一个帖子= true
选项,如清单9 - 11所示。
清单9 - 11 -链接调用一个POST请求
< ? php回声link_to(“去购物车”,“shoppingCart /添加? id = 100”,数组(“职位”= >真正的))? >= > < onclick =“f = document.createElement(形式);document.body.appendChild (f);f。方法=“POST”;f。action = this.href;f.submit(),返回false;”href =“/ shoppingCart /添加html / id / 100.”>去购物车< / >
这<一>
标签有一个href
属性,浏览器不支持JavaScript,如搜索引擎机器人会做的链接默认。所以你也必须限制你的行动作出回应POST方法,通过添加类似以下的动作:
这个美元- >forward404Unless(这个美元- >getRequest()- >isMethod(“职位”));
只要确保你不链接位于表单上使用这个选项,因为它自己生成<形式>
标签。
这是一个好习惯标签发布链接,发布数据。
迫使请求参数作为变量
根据你的路由规则,变量作为参数传递link_to ()
转换为模式。如果没有匹配的规则的内部URIrouting.yml
文件,默认规则转换模块/行动?键=值
成/模块/行动/键/值
如清单9 - 12所示。
清单9 - 12 -默认路由规则
< ? php回声link_to(“我的文章”,“= Finance_in_France文章/读?”)? >= > < a href =/ /读/标题/ Finance_in_France条”>我的文章< / >
如果你真的需要得到语法,有请求参数传递下?键=值形式——你应该把外面的变量需要迫使URL参数,query_string
选择。这将冲突也与锚在URL中,你必须把它进入锚
选择而不是将它内部的URI。所有的链接帮助接受这些选项,如清单卖地所示。
与清单卖地,迫使变量query_string
选项
< ? php回声link_to(“我的文章”,/读条的,数组(“query_string”= >“标题= Finance_in_France”,“锚”= >“foo”))? >= > < a href =“标题/文章/读? = Finance_in_France # foo”>我的文章< / >
一个URL请求参数出现的变量可以被一个脚本在客户端,和$ _GET
和$ _REQUEST
变量在服务器端。
侧边栏
资产助手
第7章介绍了资产的帮手image_tag ()
,stylesheet_tag ()
,javascript_include_标记()
,这允许您将包括一个图像,一个样式表,或者响应的JavaScript文件。这些资产的路径不是由路由系统处理,因为它们链接到资源实际上是位于公共web目录下。
你不需要提及一个资产的文件扩展名。ob娱乐下载Symfony自动添加. png
,. js
,或. css
到一个图像、JavaScript或样式表助手的电话。同时,symob娱乐下载fony会自动寻找这些资产/图片/ web /遗产
,web / js /
,web / css /
目录。当然,如果你想要包含一个特定的文件格式或一个文件从一个特定的位置,只使用完整的文件名或完整的文件路径作为参数。
修复一个图像的大小,使用大小
属性。预计像素的宽度和高度,由一个分隔x
。
< ? php回声image_tag(“测试”,“大小= 100 x20”))? >= > < img href =“遗产/图片/ test.png”宽度=“100”身高=“20”/ >
如果你想资产包含的<头>
节(JavaScript文件和样式表),你应该使用use_stylesheet ()
和use_javascript ()
助手在你的模板,而不是_tag ()
版本的布局。他们将资产添加到响应,这些资产包括前< / >头
标签被发送到浏览器。
使用绝对路径
链接和资产助手默认生成相对路径。强制输出绝对路径,设置绝对
选项真正的
,见清单9-14。这对于夹杂物技术是有用的链接在电子邮件、RSS提要,或者API的回应。
清单9-14 -绝对url,而不是相对url
< ? php回声url_for(“= Finance_in_France文章/读?”)? >= >' / / url / / Finance_in_France路由的< ? php回声url_for(“= Finance_in_France文章/读?”,真正的)? >= >“http://www.example.com/routed/url/to/Finance_in_France”< ? php回声link_to(“金融”,“= Finance_in_France文章/读?”)? >= > < a href =“/路由/ url / / Finance_in_France”< / > >金融< ? php回声link_to(“金融”,“= Finance_in_France文章/读?”,“绝对= true”)? >= > < a href =“http://www.example.com/routed/url/to/Finance_in_France”< / > >金融/ /资产也是一样的帮手< ? php回声image_tag(“测试”,“绝对= true”)? >< ? php回声javascript_include_tag(“myscript”,“绝对= true”)? >
侧边栏
邮件助手
如今,e-mail-harvesting机器人绕行网络,和你不能显示电子邮件地址在网站上没有几天内成为垃圾邮件受害者。这就是为什么symfonob娱乐下载y提供了mail_to ()
帮手。
的mail_to ()
助手接受两个参数:实际的电子邮件地址和应该显示的字符串。附加选项接受编码
参数在HTML输出非常不可读,理解的浏览器而不是由机器人。
< ? php回声mail_to(“myaddress@mydomain.com”,“接触”)? >= > < a href =“mailto: myaddress@mydomain.com联系> < / > < ?php echo mail_to (“myaddress@mydomain.com”、“接触”,“编码= true”) ? > = > < a href = "ma... om">ct... ess
编码的电子邮件是由随机十进制和十六进制字符转换的实体编码器。这个技巧停止大部分的address-harvesting垃圾邮件,但请注意,收获技术发展迅速。
路由配置
路由系统做两件事:
- 它解释外部传入的请求的URL转换成内部URI,确定模块/行动和请求参数。
- 它内部uri格式用于链接到外部url(如果你使用助手的联系)。
转换是基于一组路由规则。这些规则存储在一个routing.yml
配置文件位于应用程序配置/
目录中。清单15显示了默认的路由规则,与每一个symfony项目捆绑在一起。ob娱乐下载
清单9 - 15 -默认的路由规则,前端/ config / routing.yml
#默认规则主页:url: /参数:{模块:默认情况下,行动:指数}#通用规则#请删除它们通过添加更具体的规则default_index: url: /:模块参数:{行动:指数}默认值:url: /: / *模块/动作
规则和模式
路由规则是双射的外部URL和内部之间的关联的URI。一个典型的由以下规则:
- 一个独特的标签,易读性和速度,可以通过链接的帮手
- 匹配模式(
url
键) - 请求参数值(数组
参数
键)
模式可以包含通配符(由星号表示,*
)和命名的通配符(从一个冒号开始,:
)。一个名叫通配符匹配成为一个请求参数的值。例如,默认的
清单15中定义的规则将匹配任何URL/ foo / bar
,并设置模块
参数喷火
和行动
参数酒吧
。
请注意
名叫通配符可以被削减或分离点,所以你可以写一个模式:
my_rule: url: / foo /:酒吧。:format param: { module: mymodule, action: myaction }
这样,外部URL像‘foo / 12。xml将匹配my_rule
和执行mymodule里/ myaction
有两个参数:酒吧= 12美元
和$ format = xml
。您可以添加更多的分隔符通过改变segment_separators
中的参数值sfPatternRouting
工厂配置(见19章)。
路由系统解析routing.yml
文件从上到下,停在第一场比赛。这就是为什么你必须添加自己的规则的默认的。例如,URL/ foo / 123
比赛的规则定义在清单9到16,但symfony第一次测试ob娱乐下载my_rule:
,该规则匹配,它甚至没有测试默认值:
一个。请求的处理mymodule里/ myaction
行动与酒吧
设置为123年
(而不是的foo / 123
行动)。
清单9到16 -规则解析从上到下
my_rule: url: / foo /:酒吧参数:{模块:mymodule里,行动:myaction} #默认规则默认值:url: /: / *模块/动作
请注意
当创建一个新的行动,它并不意味着您必须创建一个路由规则。如果默认模块/行动模式适合你,然后忘记routing.yml
文件。然而,如果你想自定义操作的外部URL,添加一个新规则高于默认的一个。
清单上行线显示的过程改变外部URL格式/读一篇文章行动。
清单上行线-改变的外部URL格式/读条
行动
< ? php回声url_for(的文章/读? id = 123)? >= > /文章/读/ id /123年/ /默认格式/ /改变/文章/ 123,添加一个新规则/ /你的routing.ymlarticle_by_id: url: / /条id参数:{模块:文章中,行动:阅读}
问题是article_by_id
清单上行线打破规则的默认路由的所有其他操作文章
模块。事实上,一个URL文章/删除
这将匹配规则而不是吗默认的
并调用读
行动与id
设置为删除
而不是删除
行动。为了解决这个困难,您必须添加一个约束,这样的模式article_by_id
规则匹配只有url的地方id
通配符是一个整数。
模式的约束
当一个URL可以匹配一个以上的规则,你必须细化规则通过添加约束,或需求的模式。要求必须是一组正则表达式匹配规则的通配符来匹配。
例如,修改article_by_id
规则,这样它只匹配的urlid
参数是一个整数,规则添加一行,如清单9到18所示。
清单9到18 -添加路由规则要求
article_by_id: url: / /条id参数:{模块:文章中,行动:阅读}要求:{id: \ d +}
现在一个文章/删除
URL不能匹配article_by_id
规则了,因为“删除”
字符串不满足要求。因此,路由系统将继续寻找一个匹配在以下规则,最后找到了默认的
规则。
侧边栏
永久链接
一个好的安全路由指南是隐藏主键,代之以尽可能多的重要的字符串。如果您想给访问文章的标题,而不是从他们的ID吗?它将使外部url看起来像这样:
http://www.example.com/article/Finance_in_France
程度上,您需要创建一个新的永久链接
行动,我们将使用一个鼻涕虫
参数不是一个id
1,添加一个新规则:
article_by_id: url: / /条id参数:{模块:文章中,行动:阅读}要求:{id: \ d +} article_by_slug: url: / /条蛞蝓参数:{模块:文章中,行动:永久链接}
的永久链接
行动需要确定请求的文章的标题,所以您的模型必须提供一个适当的方法。
公共函数executePermalink(美元的请求){美元的文章= ArticlePeer::retrieveBySlug(美元的请求- >getParameter(“鼻涕虫”);这个美元- >forward404Unless(美元的文章);/ /显示404如果没有匹配的文章蛞蝓这个美元- >文章=美元的文章;/ /将对象传递给模板}
你还需要更换链接读
行动与链接在你的模板永久链接
使内部uri的正确格式。
/ /替换< ? php回声link_to(“我的文章”,“文章/读? id =”。美元的文章- >getId())? >/ /< ? php回声link_to(“我的文章”,的文章/永久链接?蛞蝓= '。美元的文章- >getSlug())? >
多亏了需求
线,外部URL/文章/ Finance_in_France
匹配article_by_slug
规则,即使article_by_id
规则先出现。
注意,文章将被检索的蛞蝓,你应该添加一个索引鼻涕虫
列文章
优化数据库性能的模型描述。
设置默认值
你可以给叫通配符默认值规则工作,即使没有定义的参数。设置的默认值参数:
数组中。
例如,article_by_id
如果不匹配规则id
参数没有设置。你可以强迫它,如清单9-19所示。
清单9-19 -设置一个默认值为一个通配符
article_by_id: url: / /条id参数:{模块:文章中,行动:阅读,id: 1}
默认的参数不需要通配符的模式。在清单9-20中,显示
参数的值真正的
,即使它不是出现在URL。
清单9-20 -设置请求参数的默认值
article_by_id: url: / /条id参数:{模块:文章中,行动:阅读,id: 1,显示:真正的}
如果你仔细观察,你可以看到文章
和读
也是默认值吗模块
和行动
变量中没有模式。
提示
您可以定义一个默认参数的所有路由规则通过调用sfRouting: setDefaultParameter ()
方法。例如,如果您希望所有的规则主题
参数设置为默认的
默认情况下,添加$ this - >内容- > getRouting () - > setDefaultParameter(“主题”、“违约”);
你的一个全球过滤器。
加快路由使用规则名称
助手的联系接受规则标签而不是模块/行动对之前如果规则标签是一个“在”符号(@),如清单9所示。
清单9 -使用规则标签而不是模块/行动
< ? php回声link_to(“我的文章”,“文章/读? id =”。美元的文章- >getId())? >/ /也可以写成< ? php回声link_to(“我的文章”,“@article_by_id id = ?”。美元的文章- >getId())? >/ /或最快的一个(不需要额外的解析):< ? php回声link_to(“我的文章”,“article_by_id”,数组(“id”= >美元的文章- >getId()))? >
这个技巧有优点和缺点。优点如下:
- 内部uri的格式完成得更快,因为symfony不必浏览所有规则来查找匹配的一个链接。ob娱乐下载在大量发送超链接的页面,将明显提高如果你使用规则/行动对标签而不是模块。
- 使用规则标签有助于抽象一个行动背后的逻辑。如果你决定改变一个动作的名字但保持URL,一个简单的改变
routing.yml
文件就足够了。所有的link_to ()
电话仍然没有进一步的变化。 - 更明显的逻辑调用规则名称。即使你的模块和行为有明确的名字,最好是电话
@display_article_by_slug
比文章/显示
。 - 你知道哪些行为是通过阅读路由。yml文件
另一方面,缺点是添加新链接变得更少的不证自明的,因为你总是需要参考routing.yml
文件来找出哪些标签是用于一个动作。在一个大项目,你最终一定会得到很多路由规则,有点难以维护。在这种情况下,您应该在几个插件应用程序包,每一个定义一组有限的功能。
然而,经验表明使用路由规则从长远来看是最好的选择。
提示
(在你的测试dev
环境),如果你想检查的规则匹配给定请求在浏览器中,开发网络的“日志”部分调试工具栏和寻找一行指定“匹配路线XXX”。你会发现更多的信息在16章web调试模式。
创建规则没有routing.yml
大部分的配置文件是真实的,routing.yml
是一个解决方案定义路由规则,但不是唯一的一个。您可以在PHP定义规则,但在调用之前调度()
,因为这个方法决定了行动,根据目前的路由规则执行。在PHP中定义规则授权您创建动态规则,根据配置或其他参数。
处理路由规则的对象是sfPatternRouting
工厂。它可以从每个代码要求的一部分sfContext: getInstance () - > getRouting ()
。它的prependRoute ()
方法添加一个新规则中定义的现有的routing.yml
。预计两个参数:一个名称和一个路线sfRoute
对象。例如,routing.yml
规则定义清单9到18所示相当于PHP代码清单9-22所示。
清单9-22 -定义一个规则在PHP
sfContext::getInstance()- >getRouting()- >prependRoute(“article_by_id”,/ /路线名称新sfRoute(' / /条id”,数组(“模块”= >“文章”,“行动”= >“读”),数组(“id”= >”\ d+ ')),/ /路由对象);
的sfRoute
类构造函数接受三个参数:一个模式,一个关联数组的默认值,和另一个关联数组要求。
的sfPatternRouting
手工类有其他有用的方法来处理路线:clearRoutes ()
,hasRoutes ()
等等。指的是< a href ="http://www.symfony-project.org/api/1_4/">API文欧宝官网下载app档要学习更多的知识。
提示
一旦你开始完全理解这本书中提出的概念,你可以增加你的理解框架通过浏览网上的API文档,或者更好的是,symfony的来源。欧宝官网下载appob娱乐下载不是所有的symfony的调整和参数可以在这本书中进行描述。ob娱乐下载然而,在线文档是无限的欧宝官网下载app。
请注意
路由类是可配置的factories.yml
配置文件(改变缺省路由类,见第17章)。本章谈到了sfPatternRouting
类,它是配置默认路由类。
处理在行动路线
如果您需要检索有关当前路线的信息——例如,准备未来的“xxx回到页面”链接,您应该使用的方法sfPatternRouting
对象。返回的urigetCurrentInternalUri ()
可用于调用一个方法link_to ()
助手,见清单合唱。
清单合唱——使用sfRouting
当前的路由信息
/ /如果您需要一个URLhttp:/ /myapp.example.com/article/21美元的路由=这个美元- >getContext()- >getRouting();/ / /读条使用下面的行动美元的uri=美元的路由- >getCurrentInternalUri();= = >文章/读? id21美元的uri=美元的路由- >getCurrentInternalUri(真正的);= = > @article_by_id ? id21美元的统治=美元的路由- >getCurrentRouteName();= > article_by_id/ /如果你只需要当前模块/行动的名字,/ /记住他们是实际的请求参数美元的模块=美元的请求- >getParameter(“模块”);美元的行动=美元的请求- >getParameter(“行动”);
如果您需要将内部URI转换为外部URL——就像在一个行动url_for ()
在一个模板,使用吗genUrl ()
sfController对象的方法,见清单9-24。
清单9-24——使用sfController
将一个内部的URI
美元的uri=的文章/读? id = 21;$ url=这个美元- >getController()- >genUrl(美元的uri);= > / /条21$ url=这个美元- >getController()- >genUrl(美元的uri,真正的);= > http:/ /myapp.example.com/article/21
总结
路由是一种双向机制旨在允许外部url的格式以便他们更友好。URL重写需要允许前端控制器名称的遗漏的一个应用程序的URL的每个项目。必须使用链接助手每次你需要在模板如果你想输出一个URL路由系统两方面工作。的routing.yml
文件配置路由系统的规则和使用时的优先顺序和规则的要求。的settings.yml
文件包含附加的设置有关的前端控制器名称和可能的外部url后缀。
这项工作是GFDL许可执照。