0

0

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

php中文网

php中文网

发布时间:2016-12-05 13:26:27

|

1932人浏览过

|

来源于php中文网

原创

前言:建立一个网站系统,往往包含多个子网站,例如pc官网,移动端官网,后台管理,数据源自一个相同的数据库,整个架构上,从thinkphp来看,可以大体理解为model(m)是一样的,controller(c)包含共用api部分和不共用部分,view则是完全不共用的,这里在整个初始架构的时候,我们可以主要从以下几个方面去考虑:

配置共用的数据库、扩展Application里面的模块、自定义视图文件夹、子域名部署路由简化....

具体操作如下:

1、准备ThinkPHP环境、数据库

    a、下载官网ThinkPHP3.2完整版源码,解压命名为testWeb放置到www目录下,访问http://192.168.1.122/testWeb/,可以看到:

立即学习PHP免费学习笔记(深入)”;

     说明部署没问题的。

     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,此时可以看到页面:

HeyGen
HeyGen

HeyGen是一个AI虚拟数字人生成平台,可以根据用户提供的内容,快速生成高质量的虚拟发言人视频,支持数字化身、文本转视频和视频翻译。

下载

       此时,说明这个视图使用是正确的,但是同时也有一些不好的地方,如果模板文件多起来的时候,就不利于模板修改编辑(目录层次太深了),可以在模块配置中,定义当前模块默认的视图目录(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.html
10     IfModule>
11 VirtualHost>
12 
13 <VirtualHost *:80>
14     DocumentRoot "E:/wamp/www/testWeb/"
15     ServerName  chqtest.com
16     ServerAlias www.chqtest.com
17     <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.html
22     IfModule>
23 VirtualHost>
24 
25 <VirtualHost *:80>
26     DocumentRoot "E:/wamp/www/testWeb/"
27     ServerName  chqtest.com
28     ServerAlias admin.chqtest.com
29     <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.html
34     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_MODULE
11     '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

 

    

 

 

 

 

 

        

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

3

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

7

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

30

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

2

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

8

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

3

2026.01.15

php图片上传教程汇总
php图片上传教程汇总

本专题整合了php图片上传相关教程,阅读专题下面的文章了解更多详细教程。

2

2026.01.15

phpstorm相关教程大全
phpstorm相关教程大全

本专题整合了phpstorm相关教程汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号