目的是:同一个项目,希望用不同的域名分开不同的子站点,例如后台管理admin.xxx.com,商城shop.xxx.com,接口 api.xxx.com等。
参考
http://codeigniter.org.cn/forums/thread-24073-1-1.html
文件夹目录
application
下分别新建public、shop、admin文件夹。原来application
目录下的所有文件,都复制一份到以上三个文件夹内。现在目标是shop、admin分别有自己的入口文件,能使用自己的model、libraries等等,同时也能调用public内的文件。
入口文件index.php
原先根目录下的index.php
,复制到public
目录中。修改以下地方:
//重新定义$system_path
$system_path = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'system';
//注释掉$application_folder和$view_folder的定义
//$application_folder = 'application';
//$view_folder = '';
//新增一个全局变量 PUBLIC_PATH
$public_path = dirname(__FILE__).DIRECTORY_SEPARATOR;
define('PUBLIC_PATH',$public_path);
shop
目录下新建index.php
,内容如下:
<?php
//定义application_folder和$view_folder
$application_folder = dirname(__FILE__);
$view_folder = dirname(__FILE__).DIRECTORY_SEPARATOR.'views';
//然后引用public目录的index.php
include dirname($application_folder).DIRECTORY_SEPARATOR.'public'.DIRECTORY_SEPARATOR.'index.php';
admin
目录同理
loader
loader负责加载视图、模型、库等。现在需要重写loader。复制\system\core\Loader.php
到shop
目录的core
目录,并且重名为MY_Loader.php
。修改的内容如下:
protected $_ci_library_paths = array(APPPATH, BASEPATH,PUBLIC_PATH);
protected $_ci_model_paths = array(APPPATH,PUBLIC_PATH);
protected $_ci_helper_paths = array(APPPATH, BASEPATH,PUBLIC_PATH);
也就是把之前定义的PUBLIC_PATH
加入到model、library、helper路径中。
admin
的core
也有一份相同的MY_Loader.php
。
站点配置
在windows系统、apache环境下的配置示例:
<VirtualHost *:80>
DocumentRoot "D:\PHP\phpStudy\WWW\CI3-multi-site\application\shop"
ServerName shop.ci3-multi-site.com
ServerAlias
<Directory "D:\PHP\phpStudy\WWW\CI3-multi-site\application\shop">
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "D:\PHP\phpStudy\WWW\CI3-multi-site\application\admin"
ServerName admin.ci3-multi-site.com
ServerAlias
<Directory "D:\PHP\phpStudy\WWW\CI3-multi-site\application\admin">
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
hosts文件:
127.0.0.1 shop.ci3-multi-site.com
127.0.0.1 admin.ci3-multi-site.com
测试
在shop站点的controller文件夹下有CI3默认有的Welcome.php
,直接用里面的index()
方法测试好了。
public function index(){
$this->load->model('public_model');//这是public目录下的models里面的model
$this->load->model('shop_model');//这是shop目录下的models里面的model
$data_public = $this->public_model->get_data();//model里的方法,只是简单地返回字符串
$data_shop = $this->shop_model->get_data();//同上
echo $data_public.' '.$data_shop;
echo "<br>";
$this->load->library('Shop_lib');//这是shop目录下的libraries里面的库
$this->load->library('Public_lib');//这是public目录下的libraries里面的库
$msg_shop = $this->shop_lib->get_msg();//库里的方法,简单返回字符串
$msg_public = $this->public_lib->get_msg();//同上
echo $msg_shop.' '.$msg_public;
}
然后访问shop.ci3-multi-site.com
,可以看到这个控制器分别从自己以及public的model、libraries获取到了数据。
helper引用
例如现在要在public
建立一个公共的public_helper
,然后在子站点(比如admin
)引用。
在\application\public\helpers
建立public_helper.php
。然后在admin
中的autoload.php
配置:
$autoload['helper'] = array('public');
这样就会自动加载到公共的public_helper.php
中的方法。
数据库加载的问题
配置冲突
在核心文件\system\database\DB.php
,有这样的逻辑:
1. 先加载应用所在文件夹的\config\database.php
文件(例如\application\admin\config\database.php
).
2. 然后加载公共文件夹的\config\database.php
文件(\application\public\config\database.php
)
这样,如果2个配置文件存在同名的配置,就会发生冲突,公共配置会覆盖子站点配置。
自动加载database
库
在autoload配置文件(\admin\config\autoload.php
),需要配置:
$autoload['libraries'] = array('database');
(可能是因为我改变了目录结构,导致CI3不会自动加载database
库,结果在使用$this->db时遇到错误提示:Undefined property: 控制器::$db
。)
静态文件引用
可以在根目录下建立文件夹,存放公共资源。例如根目录下新建resource
。
apache设置
<VirtualHost *:80>
ServerName resource.ci3-multi-site.com
DocumentRoot "D:\phpStudy\WWW\CI3-multi-site\resource"
<Directory "D:\phpStudy\WWW\CI3-multi-site\resource">
Options Indexes FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Header set Access-Control-Allow-Origin *
</Directory>
</VirtualHost>
hosts设置
127.0.0.1 resource.ci3-multi-site.com
在config
中设置:
$config['resource_url'] = 'http://resource.ci3-multi-site.com/';
在页面中引用
<link rel="stylesheet" type="text/css" href="<?=config_item('resource_url')?>css/font.css">
<script src="<?=config_item('resource_url')?>lib/layui/layui.js" charset="utf-8"></script>