您好,登錄后才能下訂單哦!
用http://backend/訪問后端時,頁面會自動被重定向到http://backend/index.php?r=site%2Flogin,要求進行登錄,這其中的流程是怎樣的?
按照YII的理念,框架在處理http://backend/這種鏈接時,首先要找到默認的controller,然后再找默認的action。
在backend應用的最初入口文件:index.php中,有如下代碼:
(new yii\web\Application($config))->run(); |
可以知道,application的入口文件是:
%yii-application%\vendor\yiisoft\yii2\web\Application.php
打開該文件,找到$defaultRoute的定義:
public $defaultRoute = 'site'; |
因此,可以確定默認的controller就是siteController。
對于YII框架,控制器的默認action為actionIndex,但是在這個action被執行之前,會根據controller所配置的過濾器,先執行過濾器的代碼,如果過濾器的執行結果導致action不被執行,則也沒有獲取默認action的必要了。所以首先要看siteController的過濾器是怎樣配置的。
根據YII2框架,controller中的過濾器實際上是一些behavior,被配置為在action之前或之后執行,用來做一些必要的檢查和設置等工作。對于backend應用來說,一般都需要登錄,所以有必要在action被執行之前,檢查一下用戶是否登錄,這時,就用得上過濾器了。
在siteController的過濾器配置如下:
public function behaviors() |
在上述代碼中看到配置的第一個過濾器是access,這個過濾器是YII2內置的過濾器,用來實現訪問控制,這里配置了兩條rule,其中第二條rule控制了index這個action,其中roles => [‘@’],表示只有登錄用戶才能執行actionIndex,而當前用戶還沒有登錄,所以是不能執行indexAction的,于是請求被轉到user這個model來處理。
為什么要把請求轉到user這個model來處理?因為在不同的系統中,對于登錄的邏輯處理是不一樣的,框架中需要將這些邏輯交給用戶來自己處理,而YII框架中,業務邏輯是放在model中的,所以最后由user這個model來處理。
為什么model名稱是user?看AccessControl類的定義:
public $user = 'user'; |
在這里定義了model的名稱,在init()函數中將model實例化。
關于user這個model的位置,它并沒有被放在backend的model目錄下,而是被放在了與backend平級的common目錄下,是因為有可能前端應用也需要登錄,很多時候,在一個系統中,登錄的邏輯都是一樣的。
最終,在user這個model的loginRequired函數中,執行了一個重定向,將鏈接重定向到$loginUrl所指向的地址,而這個變量的值,就是:
public $loginUrl = ['site/login'] |
所以,頁面就跳轉到登錄頁面了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。