Yii使用動作
要創建一個控制器類的動作,應該定義一個公共方法,其名稱以單詞 action 開頭。動作的返回數據表示要發送到終端用戶的響應。
第1步 - 讓我們在 ExampleController 控制器定義一個 hello-world 的動作。
render("example",\[ 'message' => $message \]); } public function actionHelloWorld() { return "Hello world!"; } } ?>第2步 - 在Web瀏覽器的地址欄中輸入URL=> http://localhost:8080/index.php?r=example/hello-world 會看到以下內容。
動作ID通常是動詞,如 create, update, delete 等。這是因爲動作通常被設計來執行在一個特定資源發生變化時。
動作ID應該只包含這些字符 − 小寫字母,數字,連字符和下劃線英文字母。
有兩種類型的動作:內聯和獨立。
內聯動作在控制器類中定義。動作的名稱是這樣從動作ID來源 -
轉換動作ID的所有單詞的第一個字母轉換成大寫
刪除連字符
添加 action 前綴
示例−
- index 變成 actionIndex.
- hello-world(如在上面的例子) 變成 actionHelloWorld.
如果您打算在不同的地方重用相同的動作,應該把它定義爲一個獨立的動作。
創建一個獨立的Action類
要創建一個獨立的action類,則應擴展 yii\base\Action 或其子類,並實現 run()方法。
第1步- 在項目根內創建 components 文件夾。在文件夾內創建一個名爲 GreetingAction.php 的文件,並使用下面的代碼。
我們剛剛創建一個可重複使用的動作。在 ExampleController 中使用它,我們應該通過重寫 actions() 方法通過映射動作來聲明動作。
第2步 - 修改 ExampleController.php 文件使用這種方式。
'app\\components\\GreetingAction', \]; } public function actionIndex() { $message = "index action of the ExampleController"; return $this->render("example",\[ 'message' => $message \]); } public function actionHelloWorld() { return "Hello world!"; } } ?>actions() 方法返回一個數組,鍵是動作ID而其值是類的名稱。
第3步 - 訪問URL=> http://localhost:8080/index.php?r=example/greeting,會看到下面的輸出。
第4步 - 也可以用行動將用戶重定向到其他URL。添加下面的動作到 ExampleController.php 如下。
public function actionOpenGoogle() {
// redirect the user browser to http://yiibai.com
return $this->redirect('http://www.yiibai.com');
}
現在,如果打開URL => http://localhost:8080/index.php?r=example/open-google, 將被重定向到 http://www.yiibai.com。
動作方法可以帶參數,它被稱作動作參數。它們的值是從$_GET檢索,並使用參數名稱作爲鍵。
第5步 - 以下動作添加到 ExampleController 控制器。
public function actionTestParams($first, $second) {
return "$first & $second";
}
第6步 - 在Web瀏覽器的地址欄中訪問URL=> http://localhost:8080/index.php?r=example/test-params&first=hello&second=world ,會看到下面的輸出。
每個控制器都有一個默認動作。當路由僅包含控制器ID,就意味着將自動請求默認動作。默認情況下,系統默認的操作是:index。可以很容易在控制覆蓋掉這個屬性。
第7步- 使用以下方式來修改 ExampleController 。
第8步 - 現在打開URL=> http://localhost:8080/index.php?r=example ,將看到以下內容。
爲了滿足請求,控制器將經歷以下生命週期 -
yii\base\Controller:init() 被調用
控制器將基於動作ID來創建動作
控制器順序地調用Web應用程序,模塊和控制器的 beforeAction()方法
控制器運行操作
控制器順序地調用Web應用程序,模塊,和控制器的afterAction()方法。
應用程序分配動作結果到響應
重要事項
控制器應該 -
每一個動作都應該包含的代碼只有幾行,儘量小
用於響應視圖
不要嵌入HTML
訪問請求數據
調用模型的方法
不處理請求數據。這些應在模型中進行處理