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 浏览器的地址栏中输入http://localhost:8080/index.php?r=example/hello-world 。您将看到以下内容。

你好世界行动

操作 ID 通常是动词,例如创建、更新、删除等。这是因为操作通常旨在执行资源的特定更改。

操作 ID 应仅包含以下字符 - 小写英文字母、数字、连字符和下划线。

有两种类型的操作:内联操作和独立操作。

内联操作在控制器类中定义。动作的名称是从动作 ID 中派生出来的:

  • 将操作 ID 的所有单词中的第一个字母变为大写。
  • 删除连字符。
  • 添加操作前缀。

例子-

  • 索引变为actionIndex。
  • hello-world(如上例所示)变为actionHelloWorld。

如果您计划在不同位置重用相同的操作,则应将其定义为独立操作。

创建独立的操作类

要创建独立的操作类,您应该扩展 yii\base\Action 或子类,并实现run()方法。

步骤 1 - 在项目根目录中创建一个组件文件夹。在该文件夹内创建一个名为GreetingAction.php的文件,其中包含以下代码。

<?php 
   namespace app\components;
   use yii\base\Action;
   class GreetingAction extends Action {
      public function run() {
         return "Greeting";
      }
   }
?>

我们刚刚创建了一个可重用的动作。要在我们的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 - 转到http://localhost:8080/index.php?r=example/greeting。您将看到以下输出。

问候语示例

步骤 4 - 您还可以使用操作将用户重定向到其他 URL。将以下操作添加到ExampleController.php

public function actionOpenGoogle() {
   // redirect the user browser to http://google.com
   return $this->redirect('http://google.com');
} 

现在,如果您打开http://localhost:8080/index.php?r=example/open-google,您将被重定向到http://google.com

操作方法可以采用参数,称为操作参数。它们的值是使用参数名称作为键从$_GET检索的。

步骤 5 - 将以下操作添加到我们的示例控制器中。

public function actionTestParams($first, $second) {
   return "$first $second";
}

步骤 6 - 在 Web 浏览器的地址栏中输入 URL http://localhost:8080/index.php?r=example/testparams&first=hello&second=world,您将看到以下输出。

运行 Hello World 示例

每个控制器都有一个默认操作。当路由仅包含控制器 ID 时,表示请求默认操作。默认情况下,操作是索引。您可以轻松地在控制器中覆盖此属性。

步骤7 - 以这种方式修改我们的ExampleController

<?php
   namespace app\controllers;
   use yii\web\Controller;
   class ExampleController extends Controller {
      public $defaultAction = "hello-world";
      /* other actions */
   }
?>

步骤 8 - 现在,如果您访问http://localhost:8080/index.php?r=example,您将看到以下内容。

运行 Hello World 示例 1

为了满足请求,控制器将经历以下生命周期 -

  • yii\base\Controller:调用init()方法。

  • 控制器根据动作ID创建动作。

  • 控制器依次调用Web 应用程序、模块和控制器的beforeAction()方法。

  • 控制器运行该操作。

  • 控制器依次调用Web 应用程序、模块和控制器的afterAction()方法。

  • 应用程序将操作结果分配给响应。

要点

控制者应该 -

  • 变得很瘦。每个操作应该只包含几行代码。
  • 使用视图进行响应。
  • 不嵌入 HTML。
  • 访问请求数据。
  • 调用模型的方法。
  • 不处理请求数据。这些应该在模型中进行处理。