由瑞安韦弗
在其核心,路由框架连接每个URL映射到一个特定的位置在一个symfony项目,反之亦然。ob娱乐下载它可以很容易地创建美丽的url而保持完全独立的应用程序逻辑。最近symfony版本与进步,路由框架现在要深入得多。ob娱乐下载
本章将介绍如何创建一个简单的web应用程序,每个客户机使用一个单独的子域(例如client1.mydomain.com和client2.mydomain.com)。通过扩展路由框架,这很容易。
client1.mydomain.com
client2.mydomain.com
请注意
本章要求您为您的项目使用原则作为一个ORM。
在这个项目中,一个虚构的公司——Sympal Builder——想要创建一个CMS,这样他们的客户可以建立网站的子域sympalbuilder.com。具体来说,客户XXX可以查看其网站xxx.sympalbuilder.com和使用管理区域xxx.sympalbuilder.com/backend.php。
sympalbuilder.com
xxx.sympalbuilder.com
xxx.sympalbuilder.com/backend.php
的Sympal名字是借用了乔纳森工资的Sympal一个内容管理框架(CMF)用symfony建造的。ob娱乐下载
Sympal
这个项目有两个基本要求:
用户应该能够创建页面和指定标题,内容,和URL的页面。
整个应用程序应该建在一个symfony项目处理所有客户网站的前端和后端通过确定客户端和加载正确的数据ob娱乐下载基于子域名。
创建这个应用程序中,服务器将需要设置路由* .sympalbuilder.com子域相同的文档根——symfony项目的web目录。ob娱乐下载
* .sympalbuilder.com
数据库的项目由客户端和页面对象。每一个客户端代表一个,由许多子域名网站页面对象。
客户端
页面
#配置/理论/模式。yml客户:列:名称:字符串(255)子域名:字符串(50)索引:subdomain_index:字段:(子域)类型:独特的页面:列:标题:字符串(255)弹头:字符串(255)内容:clob client_id:整数关系:客户:别名:客户机foreignAlias:页面onDelete:级联索引:slug_index:字段:[蛞蝓,client_id]类型:独一无二的
虽然每个表上的索引不是必要的,他们是一个好主意,因为应用程序将查询常常根据这些列。
把项目的生活,下面的测试数据到的地方数据/夹具/ fixtures.yml文件:
数据/夹具/ fixtures.yml
#数据/工装/夹具。yml客户:client_pete:名称:皮特的宠物店子域名:皮特client_pub:名称:城市酒吧和烧烤子域名:citypub页面:page_pete_location_hours:标题:位置和小时|皮特的宠物店内容:我们打开Mon -坐8点- 7点蛞蝓:位置客户:client_pete page_pub_menu:标题:城市酒吧和烧烤|菜单内容:我们的菜单由鱼,牛排,沙拉等等。鼻涕虫:菜单端:client_pub
测试数据最初引入两个网站,每一页。每个页面的完整URL由两个定义子域名列的客户端和鼻涕虫列的页面对象。
子域名
鼻涕虫
http://pete.sympalbuilder.com/location http://citypub.sympalbuilder.com/menu
Sympal Builder网站的每个页面直接对应页面模型对象,它定义了标题和内容的输出。每个URL专门链接页面对象,创建一个对象的类型sfDoctrineRoute使用鼻涕虫字段。下面的代码会自动寻找一个页面在数据库对象鼻涕虫字段相匹配的url:
sfDoctrineRoute
#应用/前端/ config /路由。yml page_show: url: /:鼻涕虫类:sfDoctrineRoute选项:模型:页面类型:对象参数:模块:页面动作:显示
上述路线正确匹配http://pete.sympalbuilder.com/location页面使用正确的页面对象。不幸的是,上述路线也匹配的URLhttp://pete.sympalbuilder.com/menu,也就是说,这家餐厅的菜单将显示在皮特的网站!在这一点上,路线也不知道客户端子域的重要性。
http://pete.sympalbuilder.com/location
http://pete.sympalbuilder.com/menu
将应用程序的生活,需要聪明的路线。它应该匹配正确的页面基于这两个鼻涕虫和的client_id匹配,可以由主机(如。pete.sympalbuilder.com)子域名列在客户端模型。为此,我们将利用路由框架通过创建一个自定义路由类。
client_id
pete.sympalbuilder.com
然而,首先,我们需要一些背景路由系统是如何工作的。
一个“路线”,在symfonob娱乐下载y中,是一个类型的对象sfRoute这有两个重要的工作:
sfRoute
生成一个URL:例如,如果你通过了page_show方法鼻涕虫参数,它应该能够生成一个真正的URL(例如/位置)。
page_show
/位置
匹配传入的URL:给定的URL从传入请求,每个路线必须能够确定URL“匹配”路线的要求。
个别航线的信息通常设置在每个应用程序的配置目录位于app / yourappname / config / routing.yml。回想一下,每个路线“一个类型的对象sfRoute”。怎么做这些简单的YAML条目sfRoute对象?
app / yourappname / config / routing.yml
尽管大多数航线是YAML文件中定义,每个条目在这个文件转化为一个实际的对象请求时间通过一种特殊类型的类称为缓存配置处理程序。最终结果是PHP代码代表每一个应用程序中。虽然这个过程的细节超出了本章的范围,峰值在最后,编译的版本page_show路线。编译后的文件位于缓存/ yourappname envname / config / config_routing.yml.php为特定的应用程序和环境。下面是一个缩短的版本page_show路线的样子:
缓存/ yourappname envname / config / config_routing.yml.php
新sfDoctrineRoute(' /:鼻涕虫,数组(“模块”= >“页面”,“行动”= >“显示”,),数组(“鼻涕虫”= >“[^ /\ \)+ ',),数组(“模型”= >“页面”,“类型”= >“对象”,));
提示
定义的类名的路线类关键在routing.yml文件。如果没有类关键是指定,默认将一类的路线sfRoute。类是另一个常见的路线sfRequestRoute它允许开发人员创建RESTful路线。路线类和可用选项的完整列表可以通过symfob娱乐下载ony的参考书
类
routing.yml
sfRequestRoute
路由框架的主要工作之一就是匹配每个传入的URL对象与正确的路线。的sfPatternRouting类代表核心路由引擎,负责这个任务。尽管它的重要性,开发人员很少会直接与互动sfPatternRouting。
sfPatternRouting
匹配正确的路线,sfPatternRouting遍历每个sfRoute和“问”的路线,如果匹配传入的url。在内部,这意味着sfPatternRouting调用sfRoute: matchesUrl ()方法在每个路由对象。该方法仅返回假如果线路不匹配传入的url。
sfRoute: matchesUrl ()
假
然而,如果路线做匹配传入的URL,sfRoute: matchesUrl ()不仅仅是回报吗真正的。相反,路线返回一个参数数组合并成请求对象。例如,urlhttp://pete.sympalbuilder.com/location匹配page_show的路线,matchesUrl ()方法将返回以下数组:
真正的
matchesUrl ()
数组(“鼻涕虫”= >“位置”)
该信息然后合并到请求对象,这也是为什么可以访问路径变量(如鼻涕虫)从操作文件和其他地方。
这个美元- >鼻涕虫=美元的请求- >getParameter(“鼻涕虫”);
正如你可能已经猜到了,重写sfRoute: matchesUrl ()方法是一个伟大的方式来扩展和定制路线做几乎任何事情。
为了扩展page_show基于子域名的路线来匹配客户端对象,我们将创建一个新的自定义类。创建一个文件命名acClientObjectRoute.class.php并将其在项目的lib /路由目录中(您需要创建这个目录):
acClientObjectRoute.class.php
lib /路由
/ / lib /路由/ acClientObjectRoute.class.php类acClientObjectRoute扩展sfDoctrineRoute{公共函数matchesUrl($ url,美元的上下文=数组()){如果(假= = =美元的参数=父::matchesUrl($ url,美元的上下文)){返回假;}返回美元的参数;}}
唯一的其他步骤是指示page_show使用这条路线类。在routing.yml,更新类关键路线:
#应用/ fo / config /路由。yml page_show: url: /:鼻涕虫类:acClientObjectRoute选项:模型:页面类型:对象参数:模块:页面动作:显示
到目前为止,acClientObjectRoute添加任何额外的功能,但是所有的碎片。的matchesUrl ()方法有两个特定的工作。
acClientObjectRoute
给自定义路由所需的功能,替换的内容acClientObjectRoute.class.php用以下文件。
类acClientObjectRoute扩展sfDoctrineRoute{受保护的baseHost美元=“.sympalbuilder.com”;公共函数matchesUrl($ url,美元的上下文=数组()){如果(假= = =美元的参数=父::matchesUrl($ url,美元的上下文)){返回假;}/ /返回false如果baseHost没有发现如果(大小写敏感(美元的上下文(“主机”],这个美元- >baseHost)= = =假){返回假;}美元的子域名=str_replace(这个美元- >baseHost,”,美元的上下文(“主机”]);美元的客户= Doctrine_Core::可以获得的(“客户”)- >findOneBySubdomain(美元的子域名);如果(!美元的客户){返回假;}返回array_merge(数组(“client_id”= >美元的客户- >id),美元的参数);}}
最初的要求父:matchesUrl ()是很重要的,因为它贯穿正常匹配过程。在这个例子中,因为URL/位置匹配page_show路线,父:matchesUrl ()将返回一个数组,其中包含匹配鼻涕虫参数。
父:matchesUrl ()
换句话说,路线匹配是为我们做了所有的努力,使剩余的方法集中于基于正确的匹配客户端子域名。
公共函数matchesUrl($ url,美元的上下文=数组()){/ /……美元的子域名=str_replace(这个美元- >baseHost,”,美元的上下文(“主机”]);美元的客户= Doctrine_Core::可以获得的(“客户”)- >findOneBySubdomain(美元的子域名);如果(!美元的客户){返回假;}返回array_merge(数组(“client_id”= >美元的客户- >id),美元的参数);}
通过执行一个简单的字符串替换,我们可以孤立子域名的主机,然后查询数据库是否任何的客户端对象子域名。如果没有客户端对象匹配的子域名,然后我们返回假表明传入的请求不匹配。然而,如果有一个客户端对象与当前子域名,我们合并一个额外的参数,client_id到返回的数组中。
的美元的上下文数组传递给matchesUrl ()很多有用的信息来填充是当前请求,包括主机,一个is_secure布尔,request_uri,HTTP方法和更多。
美元的上下文
主机
is_secure
request_uri
方法
但是,定制的路线真的完成了吗?的acClientObjectRoute类现在做以下:
传入的$ url只会匹配如果主机包含子域名属于其中的一个客户端对象。
$ url
如果路线匹配,一个额外的client_id参数匹配客户端对象返回并最终合并成请求参数。
现在正确的client_id返回的参数acClientObjectRoute通过请求对象,我们可以访问它。例如,页面/显示行动可以使用client_id找到正确的页面对象:
页面/显示
公共函数executeShow(sfWebRequest美元的请求){这个美元- >页面= Doctrine_Core::可以获得的(“页面”)- >findOneBySlugAndClientId(美元的请求- >getParameter(“鼻涕虫”),美元的请求- >getParameter(“client_id”));这个美元- >forward404Unless(这个美元- >页面);}
的findOneBySlugAndClientId ()是一种方法神奇的仪新学说1.2基于多个字段的查询对象。
findOneBySlugAndClientId ()
这是不错的,路由框架允许一个更优雅的解决方案。首先,添加以下方法acClientObjectRoute类:
受保护的函数getRealVariables(){返回array_merge(数组(“client_id”)父::getRealVariables());}
最后,行动可以完全依赖返回正确的路线页面对象。的页面/显示行动可以减少一行。
公共函数executeShow(sfWebRequest美元的请求){这个美元- >页面=这个美元- >getRoute()- >getObject();}
没有任何额外的工作,上面的代码将会查询页面基于这两个对象鼻涕虫和client_id列。此外,像所有对象的路线,动作会自动转发到404页面如果没有找到相应的对象。
但这是如何工作的呢?对象的路线,就像sfDoctrineRoute,acClientObjectRoute类扩展了,自动查询相关对象中的变量url关键的路线。例如,page_show路线,包含了:鼻涕虫变量在其url,查询页面对象通过鼻涕虫列。
url
:鼻涕虫
然而,在这个应用程序中page_show路线也必须查询页面对象的基础上client_id列。要做到这一点,我们已经覆盖了sfObjectRoute: getRealVariables (),这被称为内部对象查询确定使用哪些列。通过添加client_id这个数组字段,acClientObjectRoute将查询基于鼻涕虫和client_id列。
sfObjectRoute: getRealVariables ()
对象路线自动忽略任何变量不对应于一个真正的列。例如,如果URL包含一个关键:页面变量,但没有页面存在于相关的表列,变量将被忽略。
:页面
在这一点上,自定义路由类完成一切需要很少的努力。在下一节中,我们将重用新的路由创建一个关系的管理区域。
一个小问题仍然是如何生成的路线。想创建一个链接到一个页面下面的代码:
< ? php回声link_to(“位置”,“page_show”,美元的页面)? >
生成的url: /位置? client_id = 1
正如您可以看到的,client_id被自动添加到url。这是因为路线尝试使用所有可用的变量生成的url。由于路线是清楚的鼻涕虫参数和client_id参数,它使用时生成的路线。
为了解决这个问题,添加以下方法acClientObjectRoute类:
受保护的函数doConvertObjectToArray(美元的对象){美元的参数=父::doConvertObjectToArray(美元的对象);设置(美元的参数(“client_id”]);返回美元的参数;}
当一个对象生成的路线,它试图通过调用检索所有必要的信息doConvertObjectToArray ()。默认情况下,client_id返回的美元的参数数组中。通过取消它,但是,我们阻止它被包括在生成的url。记住,我们有这个豪华自客户端信息保存在子域本身。
doConvertObjectToArray ()
美元的参数
你可以覆盖doConvertObjectToArray ()通过添加过程完全和处理它自己toParams ()方法对模型类。此方法应该返回一个数组的参数,你想在路线的一代。
toParams ()
完成Sympal Builder应用程序中,我们需要创建一个管理每个人的地方客户端可以管理它页面。要做到这一点,我们需要一组行为,允许我们列表,创建、更新和删除页面对象。这些类型的模块是相当普遍,symfony可以自动生成模块。ob娱乐下载从命令行执行以下任务来生成一个pageAdmin模块内部应用程序调用后端:
pageAdmin
后端
php syob娱乐下载mfony学说:美元generate-module端pageAdmin页面——with-doctrine-route——与展出
上述任务相关模板生成模块的操作文件,并能使所有必要的修改页面对象。很多定制可以使这个CRUD生成,但这超出了本章的范围。
尽管上述任务准备我们的模块,我们还需要创建一个为每个行动路线。通过——with-doctrine-route选择任务,每个操作生成与一个对象的路线。这在每个操作减少代码的数量。例如,编辑行动包含一个简单的行:
——with-doctrine-route
编辑
公共函数executeEdit(sfWebRequest美元的请求){这个美元- >形式=新PageForm(这个美元- >getRoute()- >getObject());}
总的来说,我们需要的路线指数,新,创建,编辑,更新,删除行动。通常,在创建这些路线宁静的需要重要的设置方式routing.yml。
指数
新
创建
更新
删除
pageAdmin: url: /页面类:sfDoctrineRoute选项:{模型:页面,类型:列表}参数:{模块:页面,行动:指数}要求:sf_method:[有]pageAdmin_new: url: /页面/新类:sfDoctrineRoute选项:{模型:页面,类型:对象}参数:{模块:页面,行动:新}要求:sf_method:[有]pageAdmin_create: url: /页面类:sfDoctrineRoute选项:{模型:页面,类型:对象}参数:{模块:页面,操作:创建}要求:sf_method:[文章]pageAdmin_edit: url: / /页面:id /编辑类:sfDoctrineRoute选项:{模型:页面,类型:对象}参数:{模块:页面,行动:编辑}要求:sf_method:[有]pageAdmin_update: url: / /页面:id类:sfDoctrineRoute选项:{模型:页面,类型:对象}参数:{模块:页面,行动:更新}要求:sf_method:[将]pageAdmin_delete: url: / /页面:id类:sfDoctrineRoute选项:{模型:页面,类型:对象}参数:{模块:页面动作:删除}要求:sf_method:[删除]pageAdmin_show: url: / /页面:id类:sfDoctrineRoute选项:{模型:页面,类型:对象}参数:{模块:页面,行动:显示}要求:sf_method:(得到)
可视化这些路线,使用应用:路线任务,显示每一条线路的总结为一个特定的应用程序:
应用:路线
php syob娱乐下载mfony应用:美元路线后端> >应用程序当前航线申请“后端”名称方法模式pageAdmin pageAdmin_new GET /页面/页面/新pageAdmin_create POST /页pageAdmin_edit GET /页面/:id /编辑pageAdmin_update /页面/:id pageAdmin_delete删除/页面/:id pageAdmin_show得到/页面/:id
幸运的是,symfony提ob娱乐下载供了一种更容易的方法来指定所有的路线,属于传统的CRUD。取代的整个内容routing.yml用一个简单的路线。
pageAdmin:类:sfDoctrineRouteCollection选项:模型:页面prefix_path: /页面模块:pageAdmin
再一次,执行应用:路线任务想象所有的路线。您将看到,所有7以前的路线仍然存在。
php syob娱乐下载mfony应用:美元路线后端> >应用程序当前航线申请“后端”名称方法模式pageAdmin GET /页面。:sf_format pageAdmin_new /页面/新。:sf_format pageAdmin_create文章/页。:sf_format pageAdmin_edit GET /pages/:id/edit.:sf_format pageAdmin_update PUT /pages/:id.:sf_format pageAdmin_delete DELETE /pages/:id.:sf_format pageAdmin_show GET /pages/:id.:sf_format
路线集合是一种特殊类型的内部路由对象代表一个以上的路线。的sfDoctrineRouteCollection路线,例如自动生成所需的7种最常见的路线CRUD。在幕后,sfDoctrineRouteCollection无非是做创建相同的七中指定路线之前routing.yml。基本路线集合作为一个快捷方式创建一个通用组存在路线。
sfDoctrineRouteCollection
在这一点上,每一个客户端能够修改它吗页面通过URL对象在一个crud功能/页。不幸的是,每一个客户端目前能看到和修改吗所有页面对象——这些都属于不属于客户端。例如,http://pete.sympalbuilder.com/backend.php/pages渲染的列表吗这两个设备——页面位置从皮特的宠物店和页面菜单页面从城市酒吧。
/页
http://pete.sympalbuilder.com/backend.php/pages
位置
菜单
为了解决这个问题,我们将重用acClientObjectRoute创建前端。的sfDoctrineRouteCollection类生成一个组sfDoctrineRoute对象。在这个应用程序中,我们需要生成一个组acClientObjectRoute而不是对象。
为此,我们需要使用一个自定义的集合类。创建一个新文件命名acClientObjectRouteCollection.class.php并将其放入lib /路由目录中。它的内容非常简单:
acClientObjectRouteCollection.class.php
/ / lib /路由/ acClientObjectRouteCollection.class.php类acClientObjectRouteCollection扩展sfObjectRouteCollection{受保护的routeClass美元=“acClientObjectRoute”;}
的routeClass美元属性定义了类,将使用在创建每个潜在的路线。现在,每个潜在的路由是一个acClientObjectRoute路线,实际上做的工作。例如,http://pete.sympalbuilder.com/backend.php/pages现在将只列出一个页面:位置皮特的宠物店。由于自定义路由类,该指数行动只返回页面与正确的对象客户端基于请求的子域名。只有几行代码,我们已经创建了一个完整的后端模块,可以安全地使用多个客户。
routeClass美元
目前,一个客户端选择框显示在后台创建或编辑页面对象。而不是允许用户选择客户端(这将是一个安全风险),让我们设置客户端自动根据当前请求的子域名。
首先,更新PageForm对象lib / / PageForm.class.php形式。
PageForm
lib / / PageForm.class.php形式
公共函数配置(){这个美元- >useFields(数组(“标题”,“内容”,));}
选择框现在缺少的页面根据需要形式。然而,当新页面创建对象,client_id从来不是集。为了解决这个问题,手动设置有关客户端在新和创建行动。
公共函数executeNew(sfWebRequest美元的请求){美元的页面=新页面();美元的页面- >客户端=这个美元- >getRoute()- >getClient();这个美元- >形式=新PageForm(美元的页面);}
这就引入了一个新的函数getClient ()目前不存在的吗acClientObjectRoute类。让我们将它添加到类通过几个简单的修改:
getClient ()
/ / lib /路由/ acClientObjectRoute.class.php类acClientObjectRoute扩展sfDoctrineRoute{/ /……受保护的美元的客户=零;公共函数matchesUrl($ url,美元的上下文=数组()){/ /……这个美元- >客户端=美元的客户;返回array_merge(数组(“client_id”= >美元的客户- >id),美元的参数);}公共函数getClient(){返回这个美元- >客户端;}}
通过添加一个美元的客户类属性和设置它matchesUrl ()函数,我们可以很容易地让客户端对象可以通过这条路线。的client_id列的新页面对象将自动和正确设置基于当前主机的子域名。
美元的客户
通过使用路由框架,现在我们有轻松地解决了这个问题通过创建Sympal Builder应用程序。随着应用程序的增长,开发人员将能够重用其他模块的定制路线后端区(例如,所以每个客户端可以管理他们的相片画廊)。
创建一个定制的路线集合的另一个常见的原因是添加额外的,常用的路线。例如,假设一个项目雇佣了很多模型,每个国家都有一个is_active列。在管理领域,需要有一种简单的方法来切换is_active值为任何特定的对象。首先,修改acClientObjectRouteCollection并指示它添加一个新的路线集合:
is_active
acClientObjectRouteCollection
/ / lib /路由/ acClientObjectRouteCollection.class.php受保护的函数generateRoutes(){父::generateRoutes();如果(收取(这个美元- >选项(“with_is_active”])& &这个美元- >选项(“with_is_active”]){routeName美元=这个美元- >选项(“名字”]。“_toggleActive”;这个美元- >路线(routeName美元]=这个美元- >getRouteForToggleActive();}}
的sfObjectRouteCollection: generateRoutes ()方法收集实例化对象时,负责创建并将它们添加到所有需要的路线美元的路线类属性数组。在这种情况下,我们出售的实际创建路由到一个新的保护方法getRouteForToggleActive ():
sfObjectRouteCollection: generateRoutes ()
美元的路线
getRouteForToggleActive ()
受保护的函数getRouteForToggleActive(){$ url=sprintf(' % s /: % s / toggleActive: sf_format”,这个美元- >选项(“prefix_path”],这个美元- >选项(“列”]);美元的参数=数组(“模块”= >这个美元- >选项(“模块”],“行动”= >“toggleActive”,“sf_format”= >“html”);美元的需求=数组(“sf_method”= >“把”);选择美元=数组(“模型”= >这个美元- >选项(“模型”],“类型”= >“对象”,“方法”= >这个美元- >选项(“model_methods”](“对象”]);返回新这个美元- >routeClass($ url,美元的参数,美元的需求,选择美元);}
唯一剩下的一步是设置路线集合routing.yml。请注意,generateRoutes ()寻找一个选项with_is_active在添加新的路线。添加这个逻辑为我们提供了更多的控制,以防我们想使用acClientObjectRouteCollection以后,不需要的地方toggleActive路线:
generateRoutes ()
with_is_active
toggleActive
#应用/前端/ config /路由。yml pageAdmin:类:acClientObjectRouteCollection选项:模型:prefix_path页:页面/模块:pageAdmin with_is_active:真的
检查应用:路线任务和验证新的toggleActive路线。仅存的一块是创建的行动做实际的工作。因为你可能想要使用这条路线收集和相应的行动在几个模块,创建一个新的backendActions.class.php文件应用程序/后端/ lib /行动目录中(您需要创建这个目录):
backendActions.class.php
应用程序/后端/ lib /行动
#应用/后端/ lib /行动/ backendActions.class.php类backendActions扩展sfActions{公共函数executeToggleActive(sfWebRequest美元的请求){obj美元=这个美元- >getRoute()- >getObject();obj美元- >is_active= !obj美元- >is_active;obj美元- >保存();这个美元- >重定向(这个美元- >getModuleName()。“/指数”);}}
最后,改变的基类pageAdminActions类来扩展这个新的backendActions类。
pageAdminActions
backendActions
类pageAdminActions扩展backendActions{/ /……}
我们已经完成了什么?通过添加路线路线集合和一个关联的行动在基本操作文件,任何新的模块可以自动使用此功能只需使用acClientObjectRouteCollection和扩展backendActions类。通过这种方式,共同的功能可以很容易地在许多模块。
对象路线集合包含一系列选项,允许它是高度定制的。在很多情况下,开发人员可以使用这些选项来配置集合而不需要创建一个新的自定义路由集合类。路线的详细列表收集选项是可以通过的symfob娱乐下载ony的参考书。
每个对象路线集合接受三个不同的选项确定确切的路线生成的集合中。没有进入详细,下面的集合将生成默认路由的所有七个额外的收集途径和对象的路线:
pageAdmin:类:acClientObjectRouteCollection选项:#……行动:[列表、新创建、编辑、更新、删除、显示]collection_actions: indexAlt:[有]object_actions:切换:[将]
默认情况下,模型的主键生成的所有url中使用,用于查询的对象。当然,这可以很容易地改变。例如,下面的代码将使用鼻涕虫列而不是主键:
pageAdmin:类:acClientObjectRouteCollection选项:#……专栏:鼻涕虫
默认情况下,路由检索所有相关对象指定的路线和查询集合列为对象的路线。如果你需要重写,添加model_methods选择的路线。在这个例子中,fetchAll ()和findForRoute ()需要被添加到方法PageTable类。这两种方法都将收到一个请求参数数组作为参数:
列
model_methods
fetchAll ()
findForRoute ()
PageTable
pageAdmin:类:acClientObjectRouteCollection选项:#……model_methods:列表:fetchAll对象:findForRoute
最后,假设您需要提供一个特定的请求参数集合中的每个路由请求。这很容易完成default_params选择:
default_params
pageAdmin:类:acClientObjectRouteCollection选项:#……default_params: foo:酒吧
传统路由框架的工作-匹配并生成URL已经演变为一个完全可定制的系统能够满足项目需求最复杂的URL。通过控制路由对象,特殊的URL结构可以通过抽象业务逻辑,完全在属于它的路线。最终的结果是更多的控制,更大的灵活性和更易于管理的代码。
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。