多域的单一Codeigniter代码库

时间:2014-05-10 06:39:12

标签: php codeigniter codeigniter-2

我正在寻找有关如何将CodeIgniter用于多个域的明确说明。我想要一组模型和配置文件,能够根据请求来自的域调用不同的控制器。在做了一些研究之后,我相当肯定我目前使用这种设置的方式并不理想,而且我想在我构建太远之前修复它。这是目前的设置:

我有三个我正在管理的域名:

domainA.com
domainB.com
domainC.com

每个域都指向我服务器上的其他文件夹:

/domains
    /global
        /models
            /model1.php
            /model2.php
    /domainA.com   <--- domainA.com points here
            /application
                /controllers
                    /domainAController1.php
                    /domainAController2.php
            /assets
            /system
            /index.php
    /domainB.com    <--- domainB.com points here
            /application
                /controllers
                    /domainBController1.php
                    /domainBController2.php
            /assets
            /system
            /index.php
    /domainC.com    <--- domainC.com points here
            /application
                /controllers
                    /domainCController1.php
                    /domainCController2.php
            /assets
            /system
            /index.php

然后,在每个控制器中,我在构造函数中添加一个包路径,以便控制器可以访问我的全局模型:

$this->load->add_package_path(APPPATH.'../../global/');

这允许我像往常一样从控制器加载模型:

$this->load->model('model1');

我上面显示的文件夹层次结构不完整。在每个域文件夹中,都有一个完整的CI安装。因此,如果我想为整个“app”定义常量或配置参数,我基本上必须做三次。此外,我开发的越多,我就越需要更高级的功能,如基本型号和控制器,我感觉我现在使用的这种“包路径”解决方案不会起作用。

这显然不是正确的方法,我希望有人可以为我提供更好的方法来实现它。

我正在运行CodeIgniter 2.1.4版。

*************************** UPDATE **************** ***********

以下是我最终要做的工作。如果这是一个好的或坏的想法,我会喜欢某人的建议,这意味着,你是否预见到使用这种方法有任何明显的问题?

我使用路由和控制器子文件夹来完成我需要的东西。我现在只有一个CI安装,在我的控制器文件夹中,我有domainA.com,domainB.com和domainC.com的子文件夹。

然后,在我的routes.php文件中,我在保留路由后添加了这个:

switch($_SERVER['SERVER_NAME']){
        case 'domainA.com':
                $controllerSubDirectory = 'domainA.com';
                break;
        case 'domainB.com':
                $controllerSubDirectory = 'domainB.com';
                break;
        case 'domainC.com':
                $controllerSubDirectory = 'domainC.com';
                break;
        default:
                $controllerSubDirectory = '';
                break;
}

    route['(.*)'] = "{$controllerSubDirectory}/$1";

换句话说,我只是接收传入的请求并将其路由,就好像它实际上是使用相应的子文件夹一样,因为它是第一个URI段。

我有没有想到这个问题?也许某种安全风险?

1 个答案:

答案 0 :(得分:0)

简短回答:利用CodeIgniter“第三方Packages”功能。

您的目录结构组织得不是很好。没有必要存储CodeIgniter系统文件的多个副本,当然假设所有应用程序都使用相同的系统(对核心文件的版本和/或相同的修改)。

查看CodeIgniter Docs了解更多详情。

如上所述,您可以利用CI的软件包将打包您的公共代码作为第三方软件包。然后你可以像往常一样加载模型和其他资源,CI将知道如何在它自己上面找到它们。