有时候,几个网站做法都一样,只是显示有一点区别,新建一个项目呢,又有些重复代码,维护起来也有些麻烦,
所以,想到了用多域名绑定到cake的Plugin下,这样就可以共用很多代码,只需要写不同的地方。
默认的域名不需要在core.php中配置
效果如下图:
首先在core.php(appConfigcore.php)中,定义域名所指向的目录
(备注:由于之前,请求不同插件下的IndexController,容易传位,所以这里设置默认请求controller)
Configure::write ( 'webdomain', array( "exam.com"=>array( "plugns"=>"Exam", "controller"=>"ExamIndex"), "cloud.com"=>array( "plugns"=>"Exam", "controller"=>"ExamIndex") ) );
然后在启动的时候,动态设置访问的目录
修改libCakeRoutingDispatcher.php
中的dispatch方法
在这一句$controller = $this->_getController($request, $response);之前加
$hosts = strtolower(env('HTTP_HOST'));
$domains=Configure::read('webdomain'); if(key_exists($hosts,$domains)){ if(empty($request->params['plugin'])){ $request->params['plugin']=$domains[$hosts]["plugns"]; } //index是我在routes.php中,定义的默认请求控制器,在这里,如果是默认的,就替换为config中定义的控制器 if(!empty($request->params['controller']) && $request->params['controller']=="index"){ $request->params['controller']=$domains[$hosts]["controller"]; } }
这样就是根据域名,动态改变$request->params['plugin']值
最重要的,需要引入这个插件
引入:appConfigootstrap.php中加上
CakePlugin::load ( 'Exam', array (
'routes' => true
) );
当访问exam.com的时候,自动访问Plugin/exam下的内容,这里面的控制器或者component是可以访问其他model或者插件下的内容