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 https://www.tw511.com
   return $this->redirect('https://www.tw511.com');
}  

現在,如果開啟URL => http://localhost:8080/index.php?r=example/open-google, 將被重定向到 https://www.tw511.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
  • 存取請求資料
  • 呼叫模型的方法
  • 不處理請求資料。這些應在模型中進行處理