yii2框架 控制器

控制器生命周期:

处理一个请求时,应用主体 会根据请求路由创建一个控制器,控制器经过以下生命周期来完成请求:

在控制器创建和配置后,yii\base\Controller::init() 方法会被调用。

控制器根据请求操作ID创建一个操作对象:
如果操作ID没有指定,会使用yii\base\Controller::defaultAction默认操作ID;
如果在yii\base\Controller::actions()找到操作ID,会创建一个独立操作;
如果操作ID对应操作方法,会创建一个内联操作;
否则会抛出yii\base\InvalidRouteException异常。
控制器按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction() 方法;
如果任意一个调用返回false,后面未调用的beforeAction()会跳过并且操作执行会被取消; action execution will be cancelled.
默认情况下每个 beforeAction() 方法会触发一个 beforeAction 事件,在事件中你可以追加事件处理操作;

控制器执行操作:
请求数据解析和填入到操作参数;
控制器按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;
默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作;
应用主体获取操作结果并赋值给响应

所以总结一下:当访问一个操作请求时,整个过程是这样子:
(1)执行控制器,按顺序调用应用主体、模块(如果控制器属于模块)、控制器的 beforeAction(),即从访问顺序执行beforeAction(),完成一些必要事物。
(2)再判断有没有指定访问操作ID,如果没有,则访问yii\base\Controller::defaultAction默认操作ID。
(3)如果访问指定了访问的操作ID,那首先去执行独立操作actions里定义的对应的操作ID,如果独立的操作ID不存在,则再去访问内联操作ID,完成对应操作。
(4)最后按顺序调用控制器、模块(如果控制器属于模块)、应用主体的 afterAction() 方法;默认情况下每个 afterAction() 方法会触发一个 afterAction 事件,在事件中你可以追加事件处理操作。
(5)返回操作结果给应用主体。

Action: 内联操作和独立操作

内联操作直接在控制器中写,遵循相应规则,即内联操作是定义在Controller中的,以action前缀,并且完成需要功能的操作

将每个单词的第一个字母转为大写;去掉中横杠;增加action前缀.
例如index 转成 actionIndex, hello-world 转成 actionHelloWorld

独立操作是一些方法能让很多控制器来直接使用,达到了代码的复用目的
独立操作是一个完成独立功能的操作,处理过程独立定义,在需要的Controller中调用,完成一些事物功能,特别是一些公共的重用的功能。

独立操作通过继承yii\base\Action或它的子类来定义。 例如Yii发布的yii\web\ViewAction和yii\web\ErrorAction都是独立操作。
要使用独立操作,需要通过控制器中覆盖yii\base\Controller::actions()方法在action map中申明,如下例所示:

public function actions()
{
    return [
        // 用类来申明"error" 操作
        'error' => 'yii\web\ErrorAction',


        // 用配置数组申明 "view" 操作
        'view' => [
            'class' => 'yii\web\ViewAction',
            'viewPrefix' => '',
        ],
    ];
}

如上所示, actions() 方法返回键为操作ID、值为对应操作类名或数组configurations 的数组。 和内联操作不同,独立操作ID可包含任意字符,只要在actions() 方法中申明.

为创建一个独立操作类,需要继承yii\base\Action 或它的子类,并实现公有的名称为run()的方法, run() 方法的角色和操作方法类似,例如:

<?php
namespace app\components;

use yii\base\Action;

class HelloWorldAction extends Action
{
    public function run()
    {
        return "Hello World";
    }
}

原文链接:https://blog.csdn.net/u012979009/article/details/51611779


Comments are closed.