您好,欢迎访问一九零五行业门户网

浅谈ThinkPHP3.2的子域名部署和路由优化(一)

前言:建立一个网站系统,往往包含多个子网站,例如pc官网,移动端官网,后台管理,数据源自一个相同的数据库,整个架构上,从thinkphp来看,可以大体理解为model(m)是一样的,controller(c)包含共用api部分和不共用部分,view则是完全不共用的,这里在整个初始架构的时候,我们可以主要从以下几个方面去考虑:
配置共用的数据库、扩展application里面的模块、自定义视图文件夹、子域名部署、路由简化....
具体操作如下:
1、准备thinkphp环境、数据库
    a、下载官网thinkphp3.2完整版源码,解压命名为testweb放置到www目录下,访问http://192.168.1.122/testweb/,可以看到:
     说明部署没问题的。
     b、准备一个测试的数据库books,新建book表(id,title,price),准备好测试数据;
c、配置数据库,参考thinkphp配置加载规则,可以采用惯例配置(thinkphp/conf/convention.php),结合应用配置(application/common/conf/config.php)、模块配置(application/当前模块名/conf/config.php),
         这里我采用的是数据库配置在应用配置上:
1 //数据库配置信息 2 'db_type' => 'mysql', // 数据库类型 3 'db_host' => 'localhost', // 服务器地址localhost 4 'db_name' => 'books', // 数据库名 5 'db_user' => 'root', // 用户名 6 'db_pwd' => '', // 密码 7 'db_port' => 3306, // 端口 8 'db_prefix' => '', // 数据库表前缀 9 'db_charset'=> 'utf8', // 字符集10 'db_debug' => true, // 数据库调试模式 开启后可以记录sql日志 3.2.3新增

接着,在默认index控制器里面,添加一个操作(action):
1 public function get_book($id){2 $param['id'] = i('get.id');3 $model = m('book')->where($param)->find();4 $this->ajaxreturn($model);5 }
访问:http://192.168.1.122/testweb/index.php/home/index/get_book?id=1,就可以去到json数据,说明到此为止数据库连接和访问时正常的:
2、扩展application应用目录里面的模块
     a、快速拷贝当前的home模块,重命名为h5模块并修改相应控制器里面的名空间为:namespace h5\controller,
     访问:http://192.168.1.122/testweb/index.php/h5/index/get_book?id=1,这时成功返回数据,说明当前h5模块是可以的;同理我们可以复
     制一个admin模块。
3、自定义视图文件夹
     a、视图概念:thinkphp是基于mvc结构设计的一种php框架,如果是简单的数据库操作,往往可以省略模块里面的model,仅仅使用controller就可以完成curd操作,而视图也是其中一个很重要的功能。thinkphp中的视图主要指模板文件和模板引擎:模板文件可以简单理解为搭建积木玩具中的基本“小原件”,这“小原件”可能是不同形状,每种形状的“小原件”可能在搭建的过程中使用了一个或者多个;模板引擎,则是搭建积木玩具中的“凹凸”卡扣,形成一种规则将“小原件”组合起来。
      b、视图使用:新增home模块-index控制器-book操作来获取所有书籍,并在home模块的view文件夹下,新建index文件夹-新建book.html
1 public function book(){2 $models = m('book')->select();3 $this->assign('books',$models);4 $this->display();5 }
模板文件:
1 body>2 volist name=books id=vo>3 p>序号:{$vo.id}p>4 p>书名:{$vo.title}p>5 p style=color: #ff0000>价格:{$vo.price}p>6 volist>7 body>
c、 访问:http://192.168.1.122/testweb/index.php/home/index/book,此时可以看到页面:
此时,说明这个视图使用是正确的,但是同时也有一些不好的地方,如果模板文件多起来的时候,就不利于模板修改编辑(目录层次太深了),可以在模块配置中,定义当前模块默认的视图目录(application/home/conf/config.php):
 define('tmpl_path','./public/pc/');

类似定义h5、admin模块的视图目录,最终得到的目录组织,到此,就可以大概有几个不同的子网站的初步架构了。而对于网站的分类:二级菜单、三级菜单就可以分别对应控制器(controller)和操作(action),根据视图模板构造动态的页面:
4、子域名部署,关于子域名的解析可以参考我之前的文章网站部署一级域名、二级域名、子域名
    a、主要修改一些相关配置:
1 virtualhost *:80> 2 documentroot e:/wamp/www/testweb/ 3 servername chqtest.com 4 serveralias m.chqtest.com 5 directory e:/wamp/www/testweb/> 6 allow from all 7 directory> 8 ifmodule dir_module> 9 directoryindex mobile.php index.html index.htm default.php default.htm default.html10 ifmodule>11 virtualhost>12 13 virtualhost *:80>14 documentroot e:/wamp/www/testweb/15 servername chqtest.com16 serveralias www.chqtest.com17 directory e:/wamp/www/testweb/>18 allow from all 19 directory>20 ifmodule dir_module>21 directoryindex index.php index.html index.htm default.php default.htm default.html22 ifmodule>23 virtualhost>24 25 virtualhost *:80>26 documentroot e:/wamp/www/testweb/27 servername chqtest.com28 serveralias admin.chqtest.com29 directory e:/wamp/www/testweb/>30 allow from all 31 directory>32 ifmodule dir_module>33 directoryindex index.php index.html index.htm default.php default.htm default.html34 ifmodule>35 virtualhost>
此时,也就是说,有不同子域名(二级网站别名)www.chqtest.com   m.chqtest.com  admin.chqtest.com都可以直接访问到www/testweb目录下,如http://www.chqtest.com/index.php/home/index/book,
      http://m.chqtest.com/index.php/home/index/book都是一样的,只是访问到home模块下的书籍页面(改home为h5也都指向手机端页面);
     b、那么如果要根据不同的子域名,直接绑定到不同的模块怎么办?参考thinkphp的域名部署,也就是在惯用配置下补充一些信息:
1 'app_sub_domain_deploy' => true, // 是否开启子域名部署 2 //完整域名部署 3 'app_sub_domain_rules' => array( // 子域名部署规则 4 'www.chqtest.com' => 'home', // www.chqtest.com域名指向home模块 5 'm.chqtest.com' => 'h5', 6 'admin.chqtest.com' => 'admin', 7 ), 8 'app_domain_suffix' => '', // 域名后缀 如果是com.cn net.cn 之类的后缀必须设置 9 'action_suffix' => '', // 操作方法后缀10 'multi_module' => true, // 是否允许多模块 如果为false 则必须设置 default_module11 'module_deny_list' => array('common','runtime'),12 'module_allow_list' => array('home','h5','admin'), // 允许访问的模块列表
再次访问http://www.chqtest.com/index.php/home/index/book,http://m.chqtest.com/index.php/home/index/book,会发现有以下错误:
    这是因为绑定子域名部署之后,index.php入口文件定位到application应用目录之前,就已经根据不同的子域名,直接进入相应的目录里面了,这时home就会被判断要查找的控制器,显然当前控制器只有index,所以,重新访问:http://www.chqtest.com/index.php/index/book,http://m.chqtest.com/index.php/index/book,http://admin.chqtest.com/index.php/index/book,是不是就都分别访问到相应模块下的操作并返回视图呢:
这时,基本就可以搭建了一个大体的网站架构就进一步完善了些,从http://192.168.1.122/testweb/index.php/h5/index/book访问手机端书籍页面,到http://m.chqtest.com/index.php/index/book是不是可以省略了一级资源目录和模块名了呢,
     整个结构也清晰了很多。下一篇,将继续说说thinkphp关于路由优化,pc、h5网站相互切换的技巧,有兴趣的可以留意下,关于这次例子可以参考demo
其它类似信息

推荐信息