2015-06-21
文件:http://www.yiiframework.com/doc-2.0/yii-web-application.html#$catchAll-detail
根據官方文件說明,提到了 CatchAll 可以把用戶來的 Request 導向固定的位置,而且可以帶入一些參數如下
'on beforeRequest' => function () {
Yii::$app->catchAll = [
'site/maintenance',
'msg' => 'Showing Message'
];
},
其中 msg 就是帶入的參數,內容為字串 'Showing Message',這時候要注意幾件事情
1. 對應的 action function 的參數名稱要與指定的名稱一致。就上述例子來說參數名稱就必須要是 $msg:
public function actionMaintenance($msg){
return $this->render('maintenance');
}
如果對應的 action 所使用的參數名稱與 CatchAll 指定的不一致就會有錯誤發生,例如:
public function actionMaintenance($message){
return $this->render('maintenance');
}
你就會看到如下的錯誤
如果要傳入的參數是 array的時候,
'on beforeRequest' => function () {
Yii::$app->catchAll = [
'site/maintenance',
'msg' => [
'message' => 'Catch All TEST',
'moreMsg' => 'More Message',
]
];
},
action 所使用的參數也必須宣告成 array
public function actionMaintenance(array $msg){
return $this->render('maintenance', [
'message' => $msg['message']]
);
}
所以使用 CatchAll 需要帶參數時有幾個重點
1. action 需要宣告使用的參數名稱
2. 參數名稱要一致
3. 不可忽略參數的型態
如何使用 CatchAll 可參考
http://yii2learningnote.blogspot.tw/2015/06/yii-20-catchall.html
2015年6月21日 星期日
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
當網站關閉維修時,若想要預先提供一些資訊給用戶知道,例如一個美美的頁面有著倒數時間,而且希望無論用戶使用任何的 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 裡面
Yii 2.0 學習心得
2015-06-21
工作上使用Yii的架構已經有一兩年的時間,1.0的版本使用上已經算是得心應手。2.0推出也已經有一段時間,而1.0與2.0不相容的情況也早有耳聞。今天趁著端午休假讀了一下2.0的架構,也順利把2.0安裝並執行。一方面為了怕日後忘記曾經遇到的問題,另外一方面也算是透過文字整理一下思路,因此還是用blog把過程記錄下來。
Yii 2.0 文件:http://www.yiiframework.com/doc-2.0/
工作上使用Yii的架構已經有一兩年的時間,1.0的版本使用上已經算是得心應手。2.0推出也已經有一段時間,而1.0與2.0不相容的情況也早有耳聞。今天趁著端午休假讀了一下2.0的架構,也順利把2.0安裝並執行。一方面為了怕日後忘記曾經遇到的問題,另外一方面也算是透過文字整理一下思路,因此還是用blog把過程記錄下來。
Yii 2.0 文件:http://www.yiiframework.com/doc-2.0/
訂閱:
文章 (Atom)

