2015年6月21日 星期日

Yii 2.0 CatchAll + 參數

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月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 裡面



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/