Yii - 使用 Action

  • 简述

    要在控制器类中创建动作,您应该定义一个名称以单词 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。您将看到以下内容。
    Hello world action
    Action ID 通常是动词,例如 create、update、delete 等。这是因为动作通常被设计为在资源中执行特定的更改。
    操作 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 时,表示请求了默认操作。默认情况下,操作是index。您可以轻松地在控制器中覆盖此属性。
    第 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。
    • 访问请求数据。
    • 模型的调用方法。
    • 不处理请求数据。这些应该在模型中处理。