YII框架路由和URL生成

2022-08-28 22:06:27 字數 3618 閱讀 8890

路由和url生成

當乙個yii應用開始處理乙個請求的時候,它首先要做的便是將請求的url轉化成乙個路由。路由的作用是用於後續例項化相應的控制器和操作,以便處理請求,整個處理過程便叫做路由。路由的逆過程叫做url生成,是指用給定的路由和引數資訊來生成乙個url。當使用生成的url來發出請求的時候,路由處理的過程又能夠再次將其解析還原出原始的路由和引數資訊。

主要負責路由和url生成工作的是url管理器,其被註冊成為應用元件。url管理器提供方法parserequest()來解析請求,解析出其中的路由和引數資訊。而方法 createurl() 用於將給定的路由和引數資訊,生成乙個url。

通過在應用配置中配置url管理器,可以讓你的應用能夠識別任意的url格式,而不用修改已有程式**。例如,你能使用如下的**來生成乙個url。

use

yii\helpers\url;

//url::to() calls urlmanager::createurl() to create a url

$url = url::to(['post/view', 'id' => 100]);

取決於url管理器的配置,如上**生成的url的樣子看上去像下面這樣的。假如這個url後續被請求的話,它將被解析成上面的原始路由和引數資訊。

/index.php?r=post/view&id=100

/index.php/post/100

/posts/100

url格式

url管理器支援兩種url格式:預設url格式和漂亮url格式。預設url格式使用乙個查詢引數r傳遞路由,其他引數按照正常方式放在url中。例如,url /index.php?r=post/view&id=100 的路由為post/view和引數id為100。預設url格式並不要求對url管理器做任何配置。漂亮url格式是使用額外的路徑跟在入口指令碼名之後,來展現路由和相關引數的。例如,url /index.php/post/100的額外路徑為/post/100,其展現出的路由為post/view和引數id為100。如果要使用這種url格式,你需要根據實際需求,設計乙個url規則集。你可以通過修改url管理器中屬性enableprettyurl的值,來達到在這兩種url格式之間切換的目的。

路由

路由的工作可以分為兩步:

1.從請求中解析出乙個路由和相關引數;

2.根據路由生成響應的控制器操作,來處理該請求。

當使用預設url格式的時候,解析出路由很簡單,只要獲取引數r的值便可;

當使用漂亮url格式的時候,url管理器會檢測url規則集,從中找出與該請求匹配的路由。如果找不到規則與之匹配,將會丟擲異常yii\web\notfoundhttpexception。

一旦從請求中解析出路由,接下來要做的就是建立與該路由相關的控制器操作。路由被斜線切割成幾個部分,例如,site/index會被切割成site和index。每個部分都是乙個id,它們也許指向模組、控制器或操作。從路由的第乙個部分開始,應該會執行如下幾步來建立模組(如果有的話)、控制器和操作:

1.設定應用主體為當前模組。

2.檢查當前模組的 yii\base\module::controllermap 是否包含當前id。如果是,會根據該表中的配置建立乙個控制器物件,然後跳到步驟五執行該路由的後續片段。

3.檢查該 id 是否指向當前模組中 yii\base\module::modules 屬性裡的模組列表中的乙個模組。如果是,會根據該模組表中的配置建立乙個模組物件,然後會以新建立的模組為環境,跳回步驟二解析下一段路由。

4.將該 id 視為控制器 id,並建立控制器物件。用下個步驟解析路由裡剩下的片段。

5.控制器會在他的 yii\base\controller::actions()裡搜尋當前 id。如果找得到,它會根據該對映表中的配置建立乙個操作物件;反之,控制器則會嘗試建立乙個與該 id 相對應,由某個 action 方法所定義的行內操作(inline action)。

上面這些步驟中,如果有任何錯誤發生,應用都會丟擲異常yii\web\notfoundhttpexception,意味著路由處理失敗。

預設路由

當乙個請求沒有找到匹配的路由的時候,所謂的預設路由將會被代替使用。預設情況下,預設路由為site/index,其指向控制器site下面的操作index。你也可以通過修改應用配置中屬性defaultroute來指定它,就像下面這樣:

[

//...

'defaultroute' => 'main/index',];

catchall 路由

[

//...

'catchall' => ['site/offline'],];

建立鏈結

yii提供了乙個幫助方法yii\helpers\url::to(),根據提供的路由和引數資訊去生成各種url,如下是一些例子:

注意,上面的例子是基於預設url模式是開啟狀態的。如果漂亮url模式被啟動的話,上面建立的url會有所不同,取決於使用的url路由。

傳遞給方法 yii\helpers\url::to()的路由資訊是和上下文有關的,它可以是相對路徑,也可以是絕對路徑,可以根據下面的規則來標準化:

1. 如果路由傳遞的是空字串,當前請求的路由將被使用;

2. 如果路由不包含任何斜槓(\),它會被認為是當前控制器的某個操作的id,它將會被前置當前路由唯一id;

3. 如果路由不以斜槓(\)打頭,它會被認為是相對於當前模組的路由,它將會被前置當前模組的唯一id。

******************************===

未完待續。。。今日檢視yii框架的中文文件,點選其中包含的某個鏈結竟然報錯,被迫去其英文支援站點搜尋相關文件,對比發現:中文文件有些內容可能有刪節。於是,便想在閱讀英文文件的時候,順便做個翻譯,給後來者一些便利,不知道這樣做是否有意義?同時由於英文水平有限,翻譯過程中難免有不足之處,還請大家多多拍磚...

原文**:

YII框架分析筆記9 url路由

curlmanager初始化的時候如果url格式 預設是get格式 如果是path格式,則通過配置中的rule陣列建立路由規則物件,根據路由規則獲取內部路由,當路由都不匹配的時候會根據設定的usestrictparsing引數決定丟擲乙個404錯誤合適返回 pathinfo。如果不是path格式的話...

yii框架美化url

yii框架美化url需要在當前檔案的config目錄下main.php檔案中的components的陣列中加入這一行配置 urlmanager enableprettyurl true,美化url ture enablestrictparsing false,不啟用嚴格解析 showscriptna...

yii框架路由配置

操作思路 未重寫路由 重寫之後 去掉index.php 基礎的偽靜態檔案規則寫法 htaccess 放在web目錄下即可 rewriteengine on rewritecond d 如果是乙個目錄或檔案,就訪問目錄和檔案 rewritecond f 如果檔案存在,就直接訪問檔案,不進行下面的rew...