## URL設計
ThinkPHP5.0在沒有啟用路由的情況下典型的URL訪問規則是:
>[info] #### http://serverName/應用(或應用入口文件)/模塊/控制器/操作/[參數名/參數值...]
支持切換到命令行訪問,如果切換到命令行模式下面的訪問規則是:
>[info] #### >php.exe index.php(應用入口文件) 模塊/控制器/操作/[參數名/參數值...]
可以看到,無論是URL訪問還是命令行訪問,都采用PATHINFO模式的訪問地址,其中PATHINFO的分隔符是可以設置的。
注意:5.0取消了URL模式的概念,**普通模式的URL訪問不再支持**,如果不支持PATHINFO的服務器可以使用兼容模式訪問如下:
>[info] #### http://serverName/應用入口文件?s=/模塊/控制器/操作/[參數名/參數值...]
首先,解釋下其中的幾個概念:
|||
|---|---|
| **應用** | 基于同一個入口文件訪問的項目我們稱之為一個應用。(但應用可能具有多個入口) |
| **模塊** | 一個應用下面可以包含多個模塊,每個模塊在應用目錄下面都是一個獨立的子目錄(小寫)。 |
| **控制器** | 每個模塊可以包含多個控制器,一個控制器通常體現為一個(控制器)類(駝峰法命名)。 |
| **操作** | 每個控制器類可以包含多個操作方法,每個操作是URL訪問的最小單元。 |
## 簡化URL訪問
在ThinkPHP5.0中,出于優化的URL訪問原則,我們還做出了如下的URL訪問設計,這些設計包括:
**隱藏應用入口文件**
應用入口文件通常就是指index.php,可以通過URL重寫隱藏。
隱藏應用入口文件index.php,以Apache為例說明如何設置。
下面是Apache的配置過程,可以參考下:
1、httpd.conf配置文件中加載了mod_rewrite.so模塊
2、AllowOverride None 將None改為 All
3、把下面的內容保存為`.htaccess`文件放到應用入口文件的同級目錄下
~~~
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
~~~
**隱藏模塊**
由于默認是采用多模塊的支持,所以多個模塊的情況下必須在URL地址中標識當前模塊,如果只有一個模塊的話,可以進行模塊綁定,方法是應用的公共文件中添加如下代碼:
~~~
// 綁定index模塊
\think\Route::bind('module','index');
~~~
設置后,我們的URL訪問地址則變成:
>[info] #### http://serverName/應用入口/控制器/操作/[參數名/參數值...] // 訪問的模塊是index模塊
**隱藏控制器**
如果你的應用比較簡單,模塊和控制器都只有一個,那么可以在應用公共文件中綁定模塊和控制器,如下:
~~~
// 綁定index模塊的index控制器
\think\Route::bind('module','index/index');
~~~
設置后,我們的URL訪問地址則變成:
>[info] #### http://serverName/應用入口/操作/[參數名/參數值...] // 訪問的模塊是index模塊,控制器是Index控制器
## 單一模塊
如果你的應用比較簡單,只有一個模塊,那么可以嘗試使用單一模塊結構,方法如下:
首先在入口文件中設置
~~~
// 關閉多模塊設計
define('APP_MULTI_MODULE',false);
~~~
應用的目錄結構就變成:
~~~
├─application 應用目錄(可設置)
│ ├─runtime 應用的運行時目錄(可寫,可設置)
│ ├─controller 控制器目錄
│ ├─model 模型目錄
│ ├─view 視圖目錄
│ ├─ ... 更多類庫目錄
│ ├─common.php 函數文件
│ ├─route.php 路由配置文件
│ ├─database.php 數據庫配置文件
│ └─config.php 配置文件
~~~
URL訪問地址變成
>[info] #### http://serverName/應用入口/控制器/操作/[參數名/參數值...]
單一模塊設計的應用類庫的命名空間有所調整,例如:
~~~
app\controller\Index
app\model\User
~~~
更多的URL簡化和定制還可以通過URL路由功能實現。