2015年6月20日 星期六

Yii 2.0 CatchAll

2015-06-21

當網站關閉維修時,若想要預先提供一些資訊給用戶知道,例如一個美美的頁面有著倒數時間,而且希望無論用戶使用任何的 URL 都能夠導向這個維修頁面的時候 Yii 的 CatchAll 就是一個不錯而且簡單的方式。(當然這只是其中一個應用例子,任何時候你想要把用戶的 request 導向指定的頁面也可以用 CatchAll)

如同字面上的意思,就是把所有來自用戶的 request 擷取下來做某件事情,不過不包含錯誤的 URL,意思是用戶所指定的 request 必須是可用的 controller / action

要使用 CatchAll 可以利用下面步驟 (以下參考目錄是由 composer 產生的 Yii 2.0 結構)

1. 在 config/web.php 裡面修改 $config 的內容,加入 'on beforeRequest' 如下

$config = [
    'on beforeRequest' => function () {
            Yii::$app->catchAll = [
              'site/maintenance'
            ];
    },
];

上面的設定翻成白話文就是,在收到每個 request ( 'on beforeRequest' ) 時把它擷取下來 ( Yii::$app->CatchAll ),然後丟給 site controller 裡面的 maintenance 這個 action 處理,要注意的是 'on beforeRequest' 並不會在一開始透過 composer 產生時就會建立,需要自己打上去。

2. 當你指定每個 request 都要導向 site/maintenance 時記得在 site controller 裡面建立對應的 maintenance action,避免出錯。而在 maintenance action 裡就如同建立一般 action 一樣,你可以 render 一個對應的 view


參考上圖,套用 CatchAll 之後,無論用戶是想要存取 Store, User 或 Site 裡面的任何 action,通通都會被導向 maintenance 這個 action 裡面



沒有留言:

張貼留言