专家:添加子域名routing.yml要求
遇到的问题今天邮件列表,提供了一个绝佳的机会来证明symfony 1.2路由系统的灵活性。ob娱乐下载
翻转马克的构成如下:
我怎么点sub1.domain.com/test比sub2.domain.com/test在同一个应用程序不同的路线吗?
这是不支持本地symfony的核心,但路由系统可以很容易地扩展到满足翻转的要ob娱乐下载求。
扩展sfRequestRoute
每一个路由routing.yml
包括一组必须满足要求,为了使这条路线是成功连接。ob娱乐下载Symfony 1.2引入了sfRequestRoute类,它公开了一个sf_method
要求,允许您创建RESTful接口基于HTTP请求方法。我们可以创建一个类似的机制来公开sf_host
要求。
实施这一新的需求选项会看起来像这样:
#应用/ * / config /路由。yml homepage_sub1: url: /参数:{模块:主要作用:homepage1}类:sfRequestHostRoute要求:sf_host: sub1.example.com homepage_sub2: url: /参数:{模块:主要作用:homepage2}类:sfRequestHostRoute要求:sf_host: sub2.example.com
这些路由规则引用sfRequestHostRoute
类,我们将编写:
/ / lib /路由/ sfRequestHostRoute.class.php类sfRequestHostRoute扩展sfRequestRoute{}
执行sf_host
要求
的sf_host
要求时,必须执行路由系统检查传入的URL。这是做的matchesUrl ()方法:
类sfRequestHostRoute扩展sfRequestRoute{公共函数matchesUrl($ url,美元的上下文=数组()){如果(收取(这个美元- >需求(“sf_host”])& &这个美元- >需求(“sf_host”]! =美元的上下文(“主机”]){返回假;}返回父::matchesUrl($ url,美元的上下文);}}
这段代码检查当前请求的主机和与路线进行比较sf_host
要求。如果它们不匹配,该方法返回假
;如果它们匹配,sfRequestHostRoute
将URL传递到重载方法。
生成的url的尊重sf_host
执行sf_host
要求只是解决方案的一部分。除了解析传入的url,路由系统也为视图层生成的url。我们把考虑的主机生成的URL生成()方法:
类sfRequestHostRoute扩展sfRequestRoute{/ /……公共函数生成(美元的参数,美元的上下文=数组(),绝对的美元=假){$ url=父::生成(美元的参数,美元的上下文,绝对的美元);如果(收取(这个美元- >需求(“sf_host”])& &这个美元- >需求(“sf_host”]! =美元的上下文(“主机”]){/ /应用所需的主机美元的协议=美元的上下文(“is_secure”]吗?“https”:“http”;$ url=美元的协议。”:/ /。这个美元- >需求(“sf_host”]。$ url;}返回$ url;}}
这段代码比较当前请求的主机sf_host
路线和部队的要求代绝对URL如果他们不匹配。
的
美元的上下文
参数传递给这些路线方法不熟悉sfContext
数组对象,而是描述当前请求。看一看的更多信息sfWebRequest: getRequestContext ()。
使用新的sfRequestHostRoute
类
一旦你定义一个新的路由规则sfRequestHostRoute
类可以以同样的方式在您的模板中使用这条路你将任何其他。下面的表说明我们上面定义的路线将从每个主机时的行为。
从sub1.example.com调用 | 结果 |
---|---|
url_for (“@homepage_sub1”) |
/ |
url_for (@homepage_sub1,真的) |
http://sub1.example.com/ |
url_for (“@homepage_sub2”) |
http://sub2.example.com/ |
url_for (@homepage_sub2,真的) |
http://sub2.example.com/ |
从sub2.example.com调用 | 结果 |
---|---|
url_for (“@homepage_sub1”) |
http://sub1.example.com/ |
url_for (@homepage_sub1,真的) |
http://sub1.example.com/ |
url_for (“@homepage_sub2”) |
/ |
url_for (@homepage_sub2,真的) |
http://sub2.example.com/ |
不同子区域的环境
symfony的更有用的特性之一是它支持多种环境。ob娱乐下载生产环境上运行example.com
域,但开发环境肯定不是。
我们可以通过定义不同主机需求的环境app.yml
:
#应用/ * / config /应用程序。yml刺激:sub1_host: sub1.example.com sub2_host: sub2.example.com开发:sub1_host: sub1.example。当地sub2_host: sub2.example.local
这些值可以放置在routing.yml
使用PHP:
#应用/ * / config /路由。yml homepage_sub1: url: /参数:{模块:主要作用:homepage1}类:sfRequestHostRoute要求:sf_host: < ?php echo sfConfig:: (“app_sub1_host”)。“\ n”? >homepage_sub2: url: / param: { module: main, action: homepage2 } class: sfRequestHostRoute requirements: sf_host:
结论
通过重载两个方法和两个配置文件编辑我们扩展路由系统考虑子域。编码快乐!
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
很好的例子!尤其是environment-dependend-routing很好!
问候,兰伯特
这段代码:
$ url =父:生成(params,背景下,美元绝对美元);
如果美元绝对是真的,不是sfRequestRoute已经添加“http://%%host%%/”的url ?这将导致类似
“http://%%host%%/http:主机/ / % % % % / my_url”
也许我只是很不理解它是如何工作的。
这是我认为它是如何工作的…
(在当地与windows,我而且每进入一个新行vh主机文件。)
但是,现在我们仍然有一个问题与动态子域如www.domain.com, members.domain.com和.domain.com。
我们认为所有的需求www和潜艇,但我们想的相反情况下这些不是子域。我们看着过滤器,使用正则表达式的需求……但这并不是解决方案…
你能告诉我正确的方向吗?
* .domain.com
就太好了如果我能做点什么:
@dynamic_vhost:
url: slug.domain.com
参数{vhost模块:,行动:}
目前我有一个重写lighttpd做这个事情:
^ = > (. *).domain.com index . php /动态/ 1美元
symfony的路线是:ob娱乐下载
@dynamic_vhost:
url: /动态/:蛞蝓
参数{vhost模块:,行动:}
我的问题是,我不能使用linkhelpers链接回到普通的域,因为主机是老* .domain.com而不是http://domain.com或http://www.domain.com。
还有很多其他的助手dount函数…
任何进一步的想法就太好了
我想做类似http://usernameA.site.com
http://usernameB.site.com
什么好主意吗?
问题是什么是我们不能给要求* .domain.com,我们有超过1子域名。所以我们必须从另一个角度看,如果我们知道什么是静态子域,我们可以检查这些…
我们所做的就是我们另一个HostRouteClass从本文扩展了一个,还有检查如果是静态的潜艇之一。
类sfDynamicHostRoute sfHostRoute延伸
{
公共函数matchesUrl (url,上下文美元= array ())
{
如果(sfConfig:: (' app_static_host) & & sfConfig:: (' app_member_host '))
{
if($上下文['主机']= = sfConfig::获得(app_static_host) | | $上下文('主机']= = sfConfig::获得(app_member_host))
{
返回错误;
}
}
返回父:matchesUrl (url,上下文美元);
}
}
另一件我们发现sfRequestRoute小sf_method属性并设置(从核心sfRequestRoute.class.php):
如果(!收取($ this - >需求[' sf_method ']))
{
$ this - >需求[' sf_method '] =数组(‘得到’,‘头’);
}
所以你松散的post方法发布形式……从这一点来看,我们决定不延长HostRoute类在这个例子sfRequestRoute而是sfRoute,和工作。
在你的路由。yml你给的要求静态潜艇sfHostRoute需求和动态潜艇要求sfDynamicHostRoute……
希望这是为更多的人提供了一个解决方案。
是邮件列表克里斯是在说什么?
我想很多人会想知道如何实现这个解决方案在sfPropelRouteCollection类已经定义的路由。yml,似乎不可能将这种行为不做深修改类。
非常感谢,保持良好的工作。
安东尼
一个关键需求是动态动态子域如memberA.site.com, memberX.site.com ....www.site.com网站的外观和行为一样虽然子域的一部分作为一个变量用于连接用户的关系。我还以为这是常见的一种需求。
Symob娱乐下载fony建立的这个特性没有失去别的功能吗?
如果没有,现在正在工作,有估计发布日期吗?
谢谢