第五天:路由
如果你已经完成了第四天,你现在应该熟悉MVC模式和应该感觉更自然的编码方式。花点时间,你不会回头。练习一段时间之后,我们定制的Jobeet页面和在此过程中,还回顾了一些symfony的概念,如布局,助手和槽。ob娱乐下载
今天,我们将深入的美妙世界symfony路由框架。ob娱乐下载
url
如果你点击一个工作Jobeet主页,URL看起来像这样:/工作/显示/ id / 1
。如果你已经开发PHP网站,你可能更习惯于url/ job.php ? id = 1
。symfony使它ob娱乐下载是如何工作的呢?symfony决定ob娱乐下载如何行动,基于这个URL调用?为什么id
工作的检索$请求- > getParameter (id)
吗?这里,我们将回答所有这些问题。
但首先,让我们来谈谈url和到底。在web上下文,一个URL是一个web资源的惟一标识符。当你去一个URL,你问浏览器获取资源的URL。所以,作为URL是网站和用户之间的接口,它必须传达一些有意义的信息资源引用。但“传统”url并不描述资源,他们公开应用程序的内部结构。用户不关心你的网站开发与PHP语言或数据库中的工作有一定的标识符。公开应用程序的内部工作也很坏就安全而言:如果用户试图猜出他没有访问URL资源?当然,开发人员必须确保他们的正确方法,但你最好隐藏敏感信息。
在symfony url是如此重要,整个框架致力于ob娱乐下载他们的管理:路由框架。路由管理内部uri和外部url。当请求传入时,路由解析URL并将其转换为一个内部的URI。
你已经看到的内部工作页面的URIindexSuccess.php
模板:
“工作/节目? id =”。$工作- > getId ()
的url_for ()
助手将这种内部URI转换为适当的URL:
/工作/显示/ id / 1
内部的URI是由几个部分组成:工作
是模块,显示
是行动和查询字符串参数传给行动补充道。一般为内部uri模式是:
模块/行动?关键= value&key_1 = value_1&……
symfonyob娱乐下载的路由是一个双向的过程,您可以更改url而不改变技术实现。这是其中一个前端控制器设计模式的主要优势。
路由配置
内部uri和外部url之间的映射是在完成的routing.yml
配置文件:
#应用/前端/ config / routing.yml主页:url: /参数:{模块:默认的,行动:指数}default_index:url: /:module param: { action: index } default: url: /:module/:action/*
的routing.yml
文件描述的路线。路线有一个名称(主页
),一个模式(/ * /模块/:行动
(下),和一些参数参数
密钥)。
当请求传入时,路由试图匹配一个给定URL模式。相匹配的第一个路线获胜,这样的顺序routing.yml
是很重要的。让我们看看一些例子来更好地理解这是如何工作的。
当你请求Jobeet主页,/工作
相匹配的URL,第一个路线是default_index
一个。在一个模式,一个单词前缀和冒号(:
)是一个变量,所以/:模块
模式的意思是:匹配一个/
紧随其后的是什么。在我们的示例中,模块
变量会工作
作为一个值。这个值可以被检索$请求- > getParameter(模块)
在行动。这条路还定义了一个默认值行动
变量。所以,对于所有的url匹配这条路线,还将有一个请求行动
参数与指数
作为一个值。
如果你请求/工作/显示/ id / 1
页面,symob娱乐下载fony将比赛最后一个模式:/ * /模块/:行动
。在一个模式,一个明星(*
)匹配变量/值对的集合由斜杠分隔(/
):
请求参数 | 价值 |
---|---|
模块 | 工作 |
行动 | 显示 |
id | 1 |
请注意
的模块
和行动
变量是特殊的,因为他们被symfony用来确定要执行的动作。ob娱乐下载
的/工作/显示/ id / 1
可以从一个模板创建URL使用下面的调用url_for ()
助手:
url_for(“工作/节目? id =”。美元的工作- >getId())
您还可以使用的路线在它前面加上名字@
:
url_for(“@default ?模块=行动=出示身份证件= '。美元的工作- >getId())
这两个电话是等价的,但后者更快的路由没有解析所有航线找到最佳匹配,并减少与实现(模块和操作名称不存在内部URI)。
路线定制
现在,当你请求/
在浏览器的URL,你有默认恭喜symfony的页面。ob娱乐下载因为这个URL相匹配主页
路线。但是它是有意义的改变Jobeet主页。做出改变,修改模块
变量的主页
路线工作
:
#应用/前端/ config / routing.yml主页:url: /参数:{模块:工作、行动:索引}
我们现在可以改变链接Jobeet标志的布局使用主页
路线:
< !- - - - - -- - - - - -apps/frontend/templates/layout.php -->“< ?php echo url_for(主页)? > "> < img src =“遗产/图片/ logo.jpg”alt =“Jobeet工作委员会”/ > < / > < / h1 >
这很容易!
提示
当你更新路由配置,更改会立即考虑在开发环境中。但也让他们工作在生产环境中,您需要清除缓存通过调用缓存:清晰
的任务。
的东西多一点,让我们改变的工作页面URL更加有意义:
/工作/ sensio-labs /法国巴黎/ 1 / web开发人员
Jobeet一无所知,没有查看页面,你可以理解从URL Sensio赞助实验室正在寻找一个Web开发人员工作在巴黎,法国。
请注意
漂亮的url很重要,因为它们为用户传递信息。它也是有用的,当你在一封电子邮件中复制和粘贴URL或为搜索引擎优化你的网站。
以下模式匹配这样的网址:
/ /工作/公司/:位置:id /:位置
编辑routing.yml
文件并添加job_show_user
路线在文件的开始:
job_show_user: url: /工作/公司/:/位置:id /:位置参数:{模块:工作、行动:显示}
如果你刷新Jobeet主页,链接的工作没有改变。这是因为生成的路线,你需要通过所有所需的变量。所以,你需要改变url_for ()
电话在indexSuccess.php
:
url_for(“工作/节目? id =”。美元的工作- >getId()。“公司= '。美元的工作- >getCompany()。“位置= '。美元的工作- >getLocation()。“地位= '。美元的工作- >getPosition())
一个内部URI数组也可以表示为:
url_for(数组(“模块”= >“工作”,“行动”= >“显示”,“id”= >美元的工作- >getId(),“公司”= >美元的工作- >getCompany(),“位置”= >美元的工作- >getLocation(),“位置”= >美元的工作- >getPosition(),))
需求
在书的开始,我们讨论了验证和错误处理的理由。路由系统有一个内置的验证功能。每个模式变量可以验证一个正则表达式定义的使用需求
路由定义的条目:
job_show_user: url: /工作/公司/:/位置:id /:位置参数:{模块:工作、行动:显示}要求:id: \ d +
上面的需求
进入部队id
是一个数值。如果不是,不匹配的路线。
路线类
每个路径中定义routing.yml
内部类转换为一个对象< a href ="http://www.symfony-project.org/api/1_4/sfRoute">sfRoute
。这个类可以通过定义一个改变类
路由定义条目。如果您熟悉的HTTP协议,你知道它定义了几个“方法”,等等得到
,帖子
,头
,删除
,把
。前三个支持所有浏览器,而另外两个不是。
限制一个路由方法只适合某些请求,您可以更改类的路线< a href ="http://www.symfony-project.org/api/1_4/sfRequestRoute">sfRequestRoute
并添加一个虚拟的要求sf_method
变量:
job_show_user: url: /工作/公司/:/位置:id /:职位类:sfRequestRoute参数:{模块:工作、行动:显示}要求:id: \ d + sf_method:(得到)
请注意
要求一个路由只适合一些HTTP方法并不完全等同于使用sfWebRequest: isMethod ()
在你的行动。这是因为路由将继续寻找一个匹配的路线如果方法不匹配预期的一个。
对象方法类
新的内部URI很冗长而乏味的工作写(url_for(“工作/节目? id =”。工作- > getId()美元。& company = '。$工作- > getCompany()。“位置=”。工作- > getLocation()美元。”地位= '。$工作- > getPosition ())
),但在前面的小节中,我们刚刚得知route类可以被改变。为job_show_user
路线,最好使用< a href ="http://www.symfony-project.org/api/1_4/sfPropelRoute">sfPropelRoute
的类是优化路线代表推动推动对象的对象或集合:
job_show_user: url: /工作/公司/:/位置:id /:职位类:sfPropelRoute选项:{模型:JobeetJob类型:对象}参数:{模块:工作、行动:显示}要求:id: \ d + sf_method:(得到)
的选项
输入自定义的行为路线。在这里,模型
选项定义了推动模型类(JobeetJob
)相关路线,类型
选项定义了这个路线是与一个对象(您也可以使用列表
如果一个路线代表一个对象集合)。
的job_show_user
现在知道它的关系JobeetJob
所以我们可以简化url_for ()
|url_for ()
助手电话:
url_for(数组(“sf_route”= >“job_show_user”,“sf_subject”= >美元的工作))
或者是:
url_for(“job_show_user”,美元的工作)
请注意
第一个例子是有用的,当你需要传递多个参数只是对象的问题。
它的工作原理,因为所有的变量在路线有一个相应的访问器JobeetJob
类(例如,公司
路由变量的值替换getCompany ()
)。
如果你看一下生成的url,他们还不太像我们希望他们:
http://www.jobeet.com.localhost/frontend_dev.php/job/Sensio +实验室/法国/巴黎% 2 c + 1 / Web +开发人员
我们需要“slugify”取代所有的列值由一个非ASCII字符- - - - - -
。打开JobeetJob
类文件并添加以下方法:
/ / lib /模型/ JobeetJob.php公共函数getCompanySlug(){返回Jobeet::slugify(这个美元- >getCompany());}公共函数getPositionSlug(){返回Jobeet::slugify(这个美元- >getPosition());}公共函数getLocationSlug(){返回Jobeet::slugify(这个美元- >getLocation());}
然后,创建一个lib / Jobeet.class.php
文件并添加slugify
方法:
/ / lib / Jobeet.class.php类Jobeet{静态公共函数slugify(美元的文本){/ /替换所有非字母或数字)美元的文本=preg_replace(' /\ W+ / ',“- - -”,美元的文本);/ /修剪和小写美元的文本=函数(修剪(美元的文本,“- - -”));返回美元的文本;}}
请注意
在本教程中,我们从来没有显示< ? php
声明的代码示例中,只包含纯PHP代码优化空间和节省一些树木。显然你应该记得要把它当你创建一个新的PHP文件。记住不要把它添加到模板文件。
我们定义了三个新的“虚拟”访问器:getCompanySlug ()
,getPositionSlug ()
,getLocationSlug ()
。他们返回相应的列值在应用它slugify ()
方法。现在,您可以取代真正的通过这些虚拟的列名job_show_user
路线:
job_show_user: url: /工作/:company_slug /: location_slug /: id /: position_slug类:sfPropelRoute选项:{模型:JobeetJob类型:对象}参数:{模块:工作、行动:显示}要求:id: \ d + sf_method:(得到)
你现在会有预期的网址:
http://www.jobeet.com.localhost/frontend_dev.php/job/sensio-labs/paris-france/1/web-developer
但这只是故事的一半。路线能够生成一个URL基于一个对象,但它也能找到对象与一个给定的URL。相关的对象可以被检索getObject ()
路由对象的方法。当解析传入的请求时,路由存储匹配路由对象使用的行为。所以,改变executeShow ()
使用路由对象检索方法Jobeet
对象:
类jobActions扩展sfActions{公共函数executeShow(sfWebRequest美元的请求){这个美元- >工作=这个美元- >getRoute()- >getObject();这个美元- >forward404Unless(这个美元- >工作);}/ /……}
如果你想找到一份工作对于一个未知id
,你会看到一个404错误页面但是错误消息改变了:
这是因为在404年已经为您自动抛出的错误getRoute ()
方法。所以,我们可以简化executeShow
更多的方法:
类jobActions扩展sfActions{公共函数executeShow(sfWebRequest美元的请求){这个美元- >工作=这个美元- >getRoute()- >getObject();}/ /……}
提示
如果你不想去生成一个404错误的路线,你可以设置allow_empty
路由选择真正的
。
请注意
懒加载相关的对象的一个途径。只有如果你所说的从数据库检索getRoute ()
方法。
路由在行动和模板
在一个模板,url_for ()
助手将内部URI转换为外部URL。其他一些symfonyob娱乐下载帮手也内部URI作为参数,如link_to ()
辅助生成一个<一>
标签:
< ? php回声link_to(美元的工作- >getPosition(),“job_show_user”,美元的工作)吗?>
它生成HTML代码如下:
< a href =“/工作/ sensio-labs /法国巴黎/ 1 / web开发人员”< / > > Web开发人员
这两个url_for ()
和link_to ()
也可以生成绝对url:
url_for(“job_show_user”,美元的工作,真正的);link_to(美元的工作- >getPosition(),“job_show_user”,美元的工作,真正的);
如果你想从一个动作生成URL,您可以使用generateUrl ()
方法:
这个美元- >重定向(这个美元- >generateUrl(“job_show_user”,美元的工作));
侧边栏
“定向”方法的家庭
昨天,我们讨论了“转发”方法。这些方法当前请求转发到另一个动作没有往返的浏览器。
“定向”方法将用户重定向到另一个URL。与前进一样,您可以使用重定向()
方法,或redirectIf ()
和redirectUnless ()
快捷的方法。
路线集合类
为工作
模块,我们已经定制的显示
行动路线,但是其他的url的方法(指数
,新
,编辑
,创建
,更新
,删除
)还是管理的默认的
路线:
默认值:url: /模块/:/ *
的默认的
路线是一个伟大的方式开始编码不定义太多的路线。但随着路线作为一个“万能”,它不能被配置为特定的需要。
因为所有工作
行为是相关的JobeetJob
模型类,我们可以很容易地定义一个自定义sfPropelRoute
路线为每个我们已经做的显示
行动。但随着工作
模块定义了一个模型,经典的七个动作可能我们还可以使用< a href ="http://www.symfony-project.org/api/1_4/sfPropelRouteCollection">sfPropelRouteCollection
类。打开routing.yml
文件和修改它阅读如下:
#应用/前端/ config / routing.yml工作:类:sfPropelRouteCollection选项:{模型:JobeetJob}job_show_user: url: /工作/:company_slug /: location_slug /: id /: position_slug类:sfPropelRoute选项:{模型:JobeetJob类型:对象}参数:{模块:工作、行动:显示}要求:id: \ d + sf_method:(得到) # default rules homepage: url: / param: { module: job, action: index } default_index: url: /:module param: { action: index } default: url: /:module/:action/*
的工作
路线上面只是一个快捷方式,自动生成以下七个sfPropelRoute
路线:
工作:url: /工作。:sf_format类:sfPropelRoute选项:{模型:JobeetJob,类型:列表 } param: { module: job, action: index, sf_format: html } requirements: { sf_method: get } job_new: url: /job/new.:sf_format class: sfPropelRoute options: { model: JobeetJob, type: object } param: { module: job, action: new, sf_format: html } requirements: { sf_method: get } job_create: url: /job.:sf_format class: sfPropelRoute options: { model: JobeetJob, type: object } param: { module: job, action: create, sf_format: html } requirements: { sf_method: post } job_edit: url: /job/:id/edit.:sf_format class: sfPropelRoute options: { model: JobeetJob, type: object } param: { module: job, action: edit, sf_format: html } requirements: { sf_method: get } job_update: url: /job/:id.:sf_format class: sfPropelRoute options: { model: JobeetJob, type: object } param: { module: job, action: update, sf_format: html } requirements: { sf_method: put } job_delete: url: /job/:id.:sf_format class: sfPropelRoute options: { model: JobeetJob, type: object } param: { module: job, action: delete, sf_format: html } requirements: { sf_method: delete } job_show: url: /job/:id.:sf_format class: sfPropelRoute options: { model: JobeetJob, type: object } param: { module: job, action: show, sf_format: html } requirements: { sf_method: get }
请注意
某些线路所产生的sfPropelRouteCollection
有相同的URL。路由仍然能够使用他们,因为他们都有不同的HTTP方法的要求。
的job_delete
和job_update
线路需要不支持的浏览器的HTTP方法(删除
和把
分别)。这个作品,因为symfony模拟。ob娱乐下载打开_form.php
模板看一个例子:
/ /应用程序/前端/模块/工作/模板/ _form.php<表单动作=“…”…>< ? php如果(!美元的形式- >getObject()- >isNew()):吗?>< input type =“隐藏”name =“sf_method”值=“把”/ >< ? phpendif;吗?>< ? php回声link_to(“删除”,“工作/删除? id =”。美元的形式- >getObject()- >getId(),数组(“方法”= >“删除”,“确认”= >“你确定吗?”))吗?>
所有的symfoob娱乐下载ny助手可以告诉任何你想要的HTTP方法通过模拟特别sf_method
参数。
请注意
ob娱乐下载symfony有其他特殊参数sf_method
,所有的开始sf_
前缀。在生成的路线,你可以看到另一个:sf_format
在这本书中,这将进一步解释。
路由调试
当你使用收集的路线,它有时是有用的列表生成的路线。的应用:路线
任务输出给定应用程序的所有路线:
php syob娱乐下载mfony应用:美元路线前端
你也可以有很多线路的调试信息通过它的名字作为一个额外的参数:
前端job_ob娱乐下载edit php symfony应用:美元路线
默认路由
这是一个很好的实践为你所有的url定义路线。随着工作
路由定义应用程序所需的所有路线描述Jobeet,继续删除或注释的默认路由routing.yml
配置文件:
#应用/前端/ config / routing.yml#default_index: # url: /:module # param: { action: index } # #default: # url: /:module/:action/*
Jobeet应用程序必须仍然像以前一样工作。
最终的想法
今天挤满了大量的新信息。您已经了解了如何使用symfony的路由框架以及如何解耦技术实现你的url。ob娱乐下载
明天,我们不会引入任何新概念,而是花时间深入到目前为止我们覆盖。
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。