程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 淺談ThinkPHP3.2的子域名部署和路由優化(一),thinkphp3.2子域名

淺談ThinkPHP3.2的子域名部署和路由優化(一),thinkphp3.2子域名

編輯:關於PHP編程

淺談ThinkPHP3.2的子域名部署和路由優化(一),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 >價格:{$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.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

 

    

 

 

 

 

 

        

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved