yii2 源码分析Action类分析 (六)

Action类是控制器的基类,

<?php
namespace yii\base;

use Yii;

/**
 * Action是所有控制器动作类的基类,它继承组件类
 *
 * 动作提供了重用动作方法代码的方法,
 * Action类中的动作方法可以用于多个控制器或不同的项目中。
 *
 * 派生类必须实现一个方法叫` run() `
 * 当请求操作时,该方法将由控制器调用
 * `run()` 方法的参数由用户根据他们的名字自动输入的值确定
 * 例如, `run()`方法以以下形式定义
 *
 * ```php
 * public function run($id, $type = ‘book‘) { ... }
 * ```
 *
 * 为动作提供的参数是: `[‘id‘ => 1]`.
 * 然后 `run()` 方法 `run(1)` 自动调用.
 *
 * @property string $uniqueId 此动作在整个应用程序中的唯一标识. 此属性只读
 *
 * @author Qiang Xue <[email protected]>
 * @since 2.0
 */
class Action extends Component
{
    /**
     * @var 动作id
     */
    public $id;
    /**
     * @var Controller|\yii\web\Controller 拥有此动作的控制器
     */
    public $controller;

    /**
     * 构造方法.
     *
     * @param string $id 当前控制器id
     * @param Controller $controller 拥有此动作的控制器
     * @param array $config 将用于初始化对象属性的名称-值对
     */
    public function __construct($id, $controller, $config = [])
    {
        $this->id = $id;
        $this->controller = $controller;
        parent::__construct($config);
    }

    /**
     * 返回此操作在整个应用程序中的唯一标识
     *
     * @return string the unique ID of this action among the whole application.
     */
    public function getUniqueId()
    {
        return $this->controller->getUniqueId() . ‘/‘ . $this->id;
    }

    /**
     * 使用指定的参数运行此操作
     * 此方法主要由控制器调用
     *
     * @param array $params 要绑定到行动的run()方法的参数
     * @return 行动的结果  命名参数是否有效的
     * @throws InvalidConfigException if the action class does not have a run() method
     */
    public function runWithParams($params)
    {
        if (!method_exists($this, ‘run‘)) {
            //如果动作类没有run()方法 抛出异常
            throw new InvalidConfigException(get_class($this) . ‘ must define a "run()" method.‘);
        }
         //调用bindActionParams()方法将参数绑定到动作。
        $args = $this->controller->bindActionParams($this, $params);
        //记录跟踪消息
        Yii::trace(‘Running action: ‘ . get_class($this) . ‘::run()‘, __METHOD__);
        if (Yii::$app->requestedParams === null) {
            //请求的动作提供的参数
            Yii::$app->requestedParams = $args;
        }
        if ($this->beforeRun()) {
             //执行run()方法
            $result = call_user_func_array([$this, ‘run‘], $args);
            $this->afterRun();

            return $result;
        } else {
            return null;
        }
    }

    /**
     * 这种方法被称为右前` run() `执行
     * 可以重写此方法为动作运行做准备工作
     * 如果该方法返回false,则将取消该操作
     *
     * @return boolean whether to run the action.
     */
    protected function beforeRun()
    {
        return true;
    }

    /**
     * 这种方法被称为后` run() `执行
     * 可以重写此方法为动作运行做后处理工作
     */
    protected function afterRun()
    {
    }
}

  

时间: 2024-10-11 00:18:11

yii2 源码分析Action类分析 (六)的相关文章

yii2 源码分析 Action类分析 (六)

Action类是控制器的基类, <?php namespace yii\base; use Yii; /** * Action是所有控制器动作类的基类,它继承组件类 * * 动作提供了重用动作方法代码的方法, * Action类中的动作方法可以用于多个控制器或不同的项目中. * * 派生类必须实现一个方法叫` run() ` * 当请求操作时,该方法将由控制器调用 * `run()` 方法的参数由用户根据他们的名字自动输入的值确定 * 例如, `run()`方法以以下形式定义 * * ```ph

[Android FrameWork 6.0源码学习] LayoutInflater 类分析

LayoutInflater是用来解析XML布局文件,然后生成对象的ViewTree的工具类.是这个工具类的存在,才能让我们写起Layout来那么省劲. 我们接下来进去刨析,看看里边的奥秘 //调用inflate方法就可以把XML解析成View对象 View contentView = LayoutInflater.from(this).inflate(R.layout.activity_main, null); 我们在使用这个类的时候,通常都是像上面这样写,首先通过from函数获取对象,在调用

JDK源码之HashMap 类分析

一 概述 HashMap实现 hashmap继承了AbstractMap,实现了Map接口和Cloneable接口,HashMap是基于哈希表(散列表),实现Map接口的双列集合 jdk8中底层数据结构已经改为二叉树,之前是链表 看hashmap之前,需要把Map,AbstractMap源码撸一遍,这里放我的博文链接: https://www.cnblogs.com/houzheng/p/12687883.html 涉及到的数据结构 二 源码分析 属性 静态内部类(Entry的实现) 三 总结

Netty源码学习——ChannelPipeline模型分析

参考Netty API io.netty.channel.ChannelPipeline A list of ChannelHandlers which handles or intercepts inbound events and outbount operations of aChannel.ChannelPipeline implements an advanced form of theIntercepting Filter pattern to give a user full co

从Java源码的角度来分析HashMap与HashTable的区别

由于HashMap与HashTable都是用来存储Key-Value的键值对,所以经常拿来对比二者的区别,下面就从源码的角度来分析一下HashMap与HashTable的区别, 首先介绍一下两者的区别,然后再从源码分析. HahMap与HahTable两者主要区别: 1.继承的父类不同 <span style="font-size:18px;">public class HashMap<K, V> extends AbstractMap<K, V>

Spring mvc之源码 handlerMapping和handlerAdapter分析

Spring mvc之源码 handlerMapping和handlerAdapter分析 本篇并不是具体分析Spring mvc,所以好多细节都是一笔带过,主要是带大家梳理一下整个Spring mvc的执行流程,以及如何根据URL查找处理器Controller的实现 (适合那些刚阅读源码不知道如何下手的人) http://www.guojinbao.com/borrow/borrowDetail/GETadLPjnf0[d].do 如何根据URL地址---->找到正确处理器Controller

boost.asio源码剖析(三) ---- 流程分析

* 常见流程分析之一(Tcp异步连接) 我们用一个简单的demo分析Tcp异步连接的流程: 1 #include <iostream> 2 #include <boost/asio.hpp> 3 4 // 异步连接回调函数 5 void on_connect(boost::system::error_code ec) 6 { 7 if (ec) // 连接失败, 输出错误码 8 std::cout << "async connect error:"

std::string源码探秘和性能分析

std::string源码探秘和性能分析 本文主要讲c++标准库的string的内部实现,以及对象拷贝的性能分析. 文中采用的源码版本为gcc-4.9,测试环境为centos7, x86_64,涉及到指针等数据类型的大小也假定是在64环境位下. stl源码可以在gnu gcc的官方网站下载到:https://gcc.gnu.org/ 头文件 vector头文件,该文件也可以直接在安装了g++的linux系统中找到.主要包含以下头内容: // vector #include <bits/strin

ThreadLocal源码及相关问题分析

前言 在高并发的环境下,当我们使用一个公共的变量时如果不加锁会出现并发问题,例如SimpleDateFormat,但是加锁的话会影响性能,对于这种情况我们可以使用ThreadLocal.ThreadLocal是将公共变量copy一份到线程私有内存中以消除并发问题,ThreadLocal是JDK内部提供的高效解决并发问题的工具类之一,本文介绍ThreadLocal的重要方法的源码实现以及相关问题的分析. 数据结构 由上图可以看出,在Thread中维护了一个Entry的列表,Entry存储的是公共变