如何将子域合并到MVC框架中

时间:2009-02-02 10:55:31

标签: php model-view-controller

随着时间的推移,我开发了自己的框架并且它工作得很好 - 它很轻,速度很快,并且经过验证可以处理不错的负载。

现在我正在开发一个项目,可以说是一个在线商店,每个用户都有他的子域名,他的商品可供出售。

我的框架的工作原理是将请求网址拆分为/并确定是什么 控制器,动作参数......等。

这很好,但是如何处理子域呢?

我修改了我的请求对象,所以当我输入时可以说:

http://kodi.shop.local/

(我添加了SeverAlias * .shop.local)

这是我的请求对象的样子:

DPLS_Request Object
(
    [_request] => Array
        (
            [0] => 
            [1] => 
            [action] => defaultAction
            [controller] => home
        )

    [_params] => Array
        (
        )

    [_rurl:private] => kodi.shop.local
    [_segment] => kodi
    [get_params] => Array
        (
        )

)

所以_segment是子域名,后来我可以在代码中使用它来验证它与用户名和其他东西,但我甚至在此之前就遇到了概念问题。 我的问题是我的框架期望传递一些控制器和动作,并且因为他在URL的末尾获得的是/他假设它显示索引页面:(

那么接下来要做什么......如何在整个mvc控制器/动作故事中加入子域?

一个快速而肮脏的解决方案是修改我的请求类的一部分:

if($this->_request['controller']==''){ 
    $this->_request['controller'] = DEFAULT_CONTROLLER; 
}
if($this->_request['action']==''){
    $this->_request['action'] = DEFAULT_ACTION; 
}

并将其包含在另一个 if 中以测试是否存在_segment,如果是,则将其分配给控制器DEFAULT _SHOP _CONTROLLER,我将在配置文件中定义为'store'

所以上面的请求类似于输入http://shop.local/store/ (它将运行'store'控制器和默认操作)

在这种情况下你会做什么? 在处理子域名和控制器和操作时,有没有“最佳实践”?

3 个答案:

答案 0 :(得分:2)

听起来,对我来说,您所描述的方法是实现您添加的功能的合理下一步。新功能会带来一些额外的复杂性,但是你的Request对象/路由器应该很好地封装“当提供段时我会调用什么控制器?当提供段和控制器时?”的逻辑。我说去吧。

答案 1 :(得分:1)

我个人不会开始在与子域相关的框架中添加各种“特定”条件,因为在一种情况下子域意味着在另一种情况下并不一定意味着相同的事情。 (此外,框架假定的越多,它就越脆弱)

例如,有些人使用子域来定义语言环境(en.site.com用于英语版本,fr.site.com用于法语...),但是通过此设置,它将使用“相同”控制器no无论网站翻译成什么语言。

只需执行一个简单的重写规则: 将* .store.site.com重写为* .site.com / store /

答案 2 :(得分:0)

您所说的话听起来像多租户。 Mike Hadlow在他正在构建的ASP.NET MVC应用程序中很好地描述了他对该问题的处理方法,您可以在这里阅读: http://mikehadlow.blogspot.com/2008/11/multi-tenancy-part-2-components-and.html