淺談ThinkPHP3.2的子網(wǎng)域部署與路由最佳化(一)
Dec 05, 2016 pm 01:26 PM前言:建立一個網(wǎng)站系統(tǒng),往往包含多個子網(wǎng)站,例如PC官網(wǎng),行動端官網(wǎng),後臺管理,資料源自一個相同的資料庫,整個架構(gòu)上,從ThinkPHP來看,可以大致理解為Model(M)是一樣的,Controller(C)包含共用API部分和不共用部分,View則是完全不共用的,這裡在整個初始架構(gòu)的時候,我們可以主要從以下幾個方面去考慮:
設(shè)定共用的資料庫、擴充Application裡面的模組、自訂檢視資料夾、子網(wǎng)域部署、路由簡化....
具體操作如下:
1、準備ThinkPHP環(huán)境、資料庫
??? a、下載官網(wǎng)ThinkPHP3.2完整版原始碼,解壓縮命名為testWeb放置到www目錄下,訪問http://192.168.1.122/testWeb/,可以看到:
???? 說明部署沒問題的。
???? b、準備一個測試的資料庫books,新book表(id,title,price),準備測試資料;
????
???? c、設(shè)定資料庫,請參考ThinkPHP設(shè)定載入規(guī)則,可採用慣例設(shè)定(ThinkPHP/Conf/convention.php),結(jié)合應(yīng)用程式設(shè)定(Application/Common/Conf/config.php)、模組設(shè)定(Application/目前模組名稱/ Conf/config.php),
???????? 這裡我採用的是資料庫配置在應(yīng)用程式設(shè)定上:
<span style="color: #008080"> 1</span> <span style="color: #008000">//</span><span style="color: #008000">數(shù)據(jù)庫配置信息</span> <span style="color: #008080"> 2</span> 'DB_TYPE' => 'mysql', <span style="color: #008000">//</span><span style="color: #008000"> 數(shù)據(jù)庫類型</span> <span style="color: #008080"> 3</span> 'DB_HOST' => 'localhost', <span style="color: #008000">//</span><span style="color: #008000"> 服務(wù)器地址localhost</span> <span style="color: #008080"> 4</span> 'DB_NAME' => 'books', <span style="color: #008000">//</span><span style="color: #008000"> 數(shù)據(jù)庫名</span> <span style="color: #008080"> 5</span> 'DB_USER' => 'root', <span style="color: #008000">//</span><span style="color: #008000"> 用戶名</span> <span style="color: #008080"> 6</span> 'DB_PWD' => '', <span style="color: #008000">//</span><span style="color: #008000"> 密碼</span> <span style="color: #008080"> 7</span> 'DB_PORT' => 3306, <span style="color: #008000">//</span><span style="color: #008000"> 端口</span> <span style="color: #008080"> 8</span> 'DB_PREFIX' => '', <span style="color: #008000">//</span><span style="color: #008000"> 數(shù)據(jù)庫表前綴</span> <span style="color: #008080"> 9</span> 'DB_CHARSET'=> 'utf8', <span style="color: #008000">//</span><span style="color: #008000"> 字符集</span> <span style="color: #008080">10</span> 'DB_DEBUG' => <span style="color: #0000ff">TRUE</span>, <span style="color: #008000">//</span><span style="color: #008000"> 數(shù)據(jù)庫調(diào)試模式 開啟后可以記錄SQL日志 3.2.3新增<br></span>
??????? 接著,在預(yù)設(shè)Index控制器裡面,增加一個操作(action):
<span style="color: #008080">1</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span> get_book(<span style="color: #800080">$id</span><span style="color: #000000">){ </span><span style="color: #008080">2</span> <span style="color: #800080">$param</span>['id'] = I('get.id'<span style="color: #000000">); </span><span style="color: #008080">3</span> <span style="color: #800080">$model</span> = M('book')->where(<span style="color: #800080">$param</span>)-><span style="color: #000000">find(); </span><span style="color: #008080">4</span> <span style="color: #800080">$this</span>->ajaxReturn(<span style="color: #800080">$model</span><span style="color: #000000">); </span><span style="color: #008080">5</span> }
訪問:http://192.168.1.122/testWeb/index.php/Home/Index/get_book?id=1,就可以去到j(luò)son數(shù)據(jù),說明到此為止
??????????
2、擴充Application應(yīng)用程式目錄裡面的模組
???? a、快速拷貝目前的Home模組,並重新命名為H5模組並修改對應(yīng)控制器裡面的名空間為:namespace H5Controller,???? 存取:http://192.168.1.122/testWeb/index.php/
H5/Index/get_book?id=1,這時成功回傳數(shù)據(jù),說明目前H5模組是可以的;同理我們可以複
???? 制一個Admin模組。
3、自訂視圖資料夾
?????a、視圖概念:ThinkPHP是基於MVC結(jié)構(gòu)設(shè)計的一種PHP框架,如果是簡單的資料庫操作,往往可以省略模組裡面的Model,僅使用Controller就可以完成CURD操作,而視圖也是其中一個很重要的功能。 ThinkPHP中的視圖主要指模板文件和模板引擎:模板文件可以簡單理解為構(gòu)建積木玩具中的基本“小原件”,這“小原件”可能是不同形狀,每種形狀的“小原件”可能在搭建的過程中使用了一個或多個;模板引擎,則是搭建積木玩具中的「凹凸」卡扣,形成一種規(guī)則將「小原件」組合起來。
????? b、檢視使用:新增Home模組-Index控制器-book作業(yè)來取得所有書籍,並在Home模組的View資料夾下,新建Index資料夾-新book.html
<span style="color: #008080">1</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">function</span><span style="color: #000000"> book(){ </span><span style="color: #008080">2</span> <span style="color: #800080">$models</span> = M('book')-><span style="color: #000000">select(); </span><span style="color: #008080">3</span> <span style="color: #800080">$this</span>->assign('books',<span style="color: #800080">$models</span><span style="color: #000000">); </span><span style="color: #008080">4</span> <span style="color: #800080">$this</span>-><span style="color: #000000">display(); </span><span style="color: #008080">5</span> }
<span style="color: #008080">1</span> <span style="color: #0000ff"><</span><span style="color: #800000">body</span><span style="color: #0000ff">></span> <span style="color: #008080">2</span> <span style="color: #0000ff"><</span><span style="color: #800000">volist </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="books"</span><span style="color: #ff0000"> id</span><span style="color: #0000ff">="vo"</span><span style="color: #0000ff">></span> <span style="color: #008080">3</span> <span style="color: #0000ff"><</span><span style="color: #800000">p</span><span style="color: #0000ff">></span>序號:{$vo.id}<span style="color: #0000ff"></</span><span style="color: #800000">p</span><span style="color: #0000ff">></span> <span style="color: #008080">4</span> <span style="color: #0000ff"><</span><span style="color: #800000">p</span><span style="color: #0000ff">></span>書名:{$vo.title}<span style="color: #0000ff"></</span><span style="color: #800000">p</span><span style="color: #0000ff">></span> <span style="color: #008080">5</span> <span style="color: #0000ff"><</span><span style="color: #800000">p </span><span style="color: #ff0000">style</span><span style="color: #0000ff">="color: #FF0000"</span><span style="color: #0000ff">></span>價格:{$vo.price}<span style="color: #0000ff"></</span><span style="color: #800000">p</span><span style="color: #0000ff">></span> <span style="color: #008080">6</span> <span style="color: #0000ff"></</span><span style="color: #800000">volist</span><span style="color: #0000ff">></span> <span style="color: #008080">7</span> <span style="color: #0000ff"></</span><span style="color: #800000">body</span><span style="color: #0000ff">></span>
????? c、 訪問:http://192.168.1.122/testWeb/index.php/Home/Index/book,此時可以看到頁面:
?????? 此時,說明這個視圖使用是正確的,但是同時也有一些不好的地方,如果模板文件多起來的時候,就不利于模板修改編輯(目錄層次太深了),可以在模塊配置中,定義當前模塊默認的視圖目錄(Application/Home/Conf/config.php):
<span class="hljs-string"><span class="hljs-string"> <span class="cnblogs_code"><span style="color: #008080">define</span>('TMPL_PATH','./Public/PC/'); </span><br></span></span>
類似定義H5、admin模塊的視圖目錄,最終得到的目錄組織,到此,就可以大概有幾個不同的子網(wǎng)站的初步架構(gòu)了。而對于網(wǎng)站的分類:二級菜單、三級菜單就可以分別對應(yīng)控制器(Controller)和操作(action),根據(jù)視圖模板構(gòu)造動態(tài)的頁面:
4、子域名部署,關(guān)于子域名的解析可以參考我之前的文章網(wǎng)站部署一級域名、二級域名、子域名
a、主要修改一些相關(guān)配置:
<span style="color: #008080"> 1</span> <span style="color: #0000ff"><</span><span style="color: #800000">VirtualHost </span><span style="color: #ff0000">*:80</span><span style="color: #0000ff">></span> <span style="color: #008080"> 2</span> <span style="color: #000000"> DocumentRoot "E:/wamp/www/testWeb/" </span><span style="color: #008080"> 3</span> <span style="color: #000000"> ServerName chqtest.com </span><span style="color: #008080"> 4</span> <span style="color: #000000"> ServerAlias m.chqtest.com </span><span style="color: #008080"> 5</span> <span style="color: #0000ff"><</span><span style="color: #800000">Directory </span><span style="color: #ff0000">"E:/wamp/www/testWeb/"</span><span style="color: #0000ff">></span> <span style="color: #008080"> 6</span> <span style="color: #000000"> Allow from all </span><span style="color: #008080"> 7</span> <span style="color: #0000ff"></</span><span style="color: #800000">Directory</span><span style="color: #0000ff">></span> <span style="color: #008080"> 8</span> <span style="color: #0000ff"><</span><span style="color: #800000">IfModule </span><span style="color: #ff0000">dir_module</span><span style="color: #0000ff">></span> <span style="color: #008080"> 9</span> <span style="color: #000000"> DirectoryIndex mobile.php index.html index.htm default.php default.htm default.html </span><span style="color: #008080">10</span> <span style="color: #0000ff"></</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">></span> <span style="color: #008080">11</span> <span style="color: #0000ff"></</span><span style="color: #800000">VirtualHost</span><span style="color: #0000ff">></span> <span style="color: #008080">12</span> <span style="color: #008080">13</span> <span style="color: #0000ff"><</span><span style="color: #800000">VirtualHost </span><span style="color: #ff0000">*:80</span><span style="color: #0000ff">></span> <span style="color: #008080">14</span> <span style="color: #000000"> DocumentRoot "E:/wamp/www/testWeb/" </span><span style="color: #008080">15</span> <span style="color: #000000"> ServerName chqtest.com </span><span style="color: #008080">16</span> <span style="color: #000000"> ServerAlias www.chqtest.com </span><span style="color: #008080">17</span> <span style="color: #0000ff"><</span><span style="color: #800000">Directory </span><span style="color: #ff0000">"E:/wamp/www/testWeb/"</span><span style="color: #0000ff">></span> <span style="color: #008080">18</span> <span style="color: #000000"> Allow from all </span><span style="color: #008080">19</span> <span style="color: #0000ff"></</span><span style="color: #800000">Directory</span><span style="color: #0000ff">></span> <span style="color: #008080">20</span> <span style="color: #0000ff"><</span><span style="color: #800000">IfModule </span><span style="color: #ff0000">dir_module</span><span style="color: #0000ff">></span> <span style="color: #008080">21</span> <span style="color: #000000"> DirectoryIndex index.php index.html index.htm default.php default.htm default.html </span><span style="color: #008080">22</span> <span style="color: #0000ff"></</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">></span> <span style="color: #008080">23</span> <span style="color: #0000ff"></</span><span style="color: #800000">VirtualHost</span><span style="color: #0000ff">></span> <span style="color: #008080">24</span> <span style="color: #008080">25</span> <span style="color: #0000ff"><</span><span style="color: #800000">VirtualHost </span><span style="color: #ff0000">*:80</span><span style="color: #0000ff">></span> <span style="color: #008080">26</span> <span style="color: #000000"> DocumentRoot "E:/wamp/www/testWeb/" </span><span style="color: #008080">27</span> <span style="color: #000000"> ServerName chqtest.com </span><span style="color: #008080">28</span> <span style="color: #000000"> ServerAlias admin.chqtest.com </span><span style="color: #008080">29</span> <span style="color: #0000ff"><</span><span style="color: #800000">Directory </span><span style="color: #ff0000">"E:/wamp/www/testWeb/"</span><span style="color: #0000ff">></span> <span style="color: #008080">30</span> <span style="color: #000000"> Allow from all </span><span style="color: #008080">31</span> <span style="color: #0000ff"></</span><span style="color: #800000">Directory</span><span style="color: #0000ff">></span> <span style="color: #008080">32</span> <span style="color: #0000ff"><</span><span style="color: #800000">IfModule </span><span style="color: #ff0000">dir_module</span><span style="color: #0000ff">></span> <span style="color: #008080">33</span> <span style="color: #000000"> DirectoryIndex index.php index.html index.htm default.php default.htm default.html </span><span style="color: #008080">34</span> <span style="color: #0000ff"></</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">></span> <span style="color: #008080">35</span> <span style="color: #0000ff"></</span><span style="color: #800000">VirtualHost</span><span style="color: #0000ff">></span>
此時,也就是說,有不同子域名(二級網(wǎng)站別名)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、那么如果要根據(jù)不同的子域名,直接綁定到不同的模塊怎么辦?參考ThinkPHP的域名部署,也就是在慣用配置下補充一些信息:
<span style="color: #008080"> 1</span> 'APP_SUB_DOMAIN_DEPLOY' => <span style="color: #0000ff">true</span>, <span style="color: #008000">//</span><span style="color: #008000"> 是否開啟子域名部署 </span><span style="color: #008080"> 2</span> <span style="color: #008000"> //完整域名部署</span> <span style="color: #008080"> 3</span> 'APP_SUB_DOMAIN_RULES' => <span style="color: #0000ff">array</span>( <span style="color: #008000">//</span><span style="color: #008000"> 子域名部署規(guī)則</span> <span style="color: #008080"> 4</span> 'www.chqtest.com' => 'Home', <span style="color: #008000">//</span><span style="color: #008000"> www.chqtest.com域名指向Home模塊</span> <span style="color: #008080"> 5</span> 'm.chqtest.com' => 'H5', <span style="color: #008080"> 6</span> 'admin.chqtest.com' => 'Admin', <span style="color: #008080"> 7</span> ), <span style="color: #008080"> 8</span> 'APP_DOMAIN_SUFFIX' => '', <span style="color: #008000">//</span><span style="color: #008000"> 域名后綴 如果是com.cn net.cn 之類的后綴必須設(shè)置 </span> <span style="color: #008080"> 9</span> 'ACTION_SUFFIX' => '', <span style="color: #008000">//</span><span style="color: #008000"> 操作方法后綴</span> <span style="color: #008080">10</span> 'MULTI_MODULE' => <span style="color: #0000ff">true</span>, <span style="color: #008000">//</span><span style="color: #008000"> 是否允許多模塊 如果為false 則必須設(shè)置 DEFAULT_MODULE</span> <span style="color: #008080">11</span> 'MODULE_DENY_LIST' => <span style="color: #0000ff">array</span>('Common','Runtime'), <span style="color: #008080">12</span> 'MODULE_ALLOW_LIST' => <span style="color: #0000ff">array</span>('Home','H5','Admin'), <span style="color: #008000">//</span><span style="color: #008000"> 允許訪問的模塊列表</span>
???????????? 再次訪問http://www.chqtest.com/index.php/Home/Index/book,http://m.chqtest.com/index.php/Home/Index/book,會發(fā)現(xiàn)有以下錯誤:
??? 這是因為綁定子域名部署之后,index.php入口文件定位到Application應(yīng)用目錄之前,就已經(jīng)根據(jù)不同的子域名,直接進入相應(yīng)的目錄里面了,這時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,是不是就都分別訪問到相應(yīng)模塊下的操作并返回視圖呢:
??????????
???? 這時,基本就可以搭建了一個大體的網(wǎng)站架構(gòu)就進一步完善了些,從http://192.168.1.122/testWeb/index.php/H5/Index/book訪問手機端書籍頁面,到http://m.chqtest.com/index.php/Index/book是不是可以省略了一級資源目錄和模塊名了呢,
???? 整個結(jié)構(gòu)也清晰了很多。下一篇,將繼續(xù)說說ThinkPHP關(guān)于路由優(yōu)化,PC、H5網(wǎng)站相互切換的技巧,有興趣的可以留意下,關(guān)于這次例子可以參考Demo
?
????
?
?
?
?
?
????????

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
