zoukankan      html  css  js  c++  java
  • yii 2.0 代码阅读 小记

    1.yiiaseobject

    设置了get/set属性...使用getName()获取属性名..构造函数中使用config初始化属性

    2.yiiaseComponent 继承自Object
    额外拥有behaviors和events属性

    get,会比object多查找自己的behaviors中的属性

    set,on开通的会绑定事件,as开头的会添加行为,最后会查找所有的behaviors,并设置属性


    __call 会调用所有behaviors中是否有该方法


    event on 添加事件,off移除事件,trigger触发事件

    Yii中这个Behaviour是Event Handler的另一种表现形式而已,对事件的处理函数进行了封装
    attachBehavior detachBehavior

    Component::__construct 或者Object::__construct 的时候.就是绑定了属性
    ------------------------------------------


    3.yiiaseEvent中提供了很多静态方法供外部使用.如on off trigger
    同时.拥有 name,sender触发者,handled触发结果是个boolean值,用于停止触发.data,触发数据

    trigger 可以触发父级的事件..具体看代码

    <pre>
    if (is_object($class)) {
    $class = get_class($class);
    } else {
    $class = ltrim($class, '\');
    }
    do {
    if (!empty(self::$_events[$name][$class])) {
    foreach (self::$_events[$name][$class] as $handler) {
    $event->data = $handler[1];
    call_user_func($handler[0], $event);
    if ($event instanceof Event && $event->handled) {
    return;
    }
    }
    }
    } while (($class = get_parent_class($class)) !== false);
    </pre>


    4.yiiaseBehavior

    封装了事件处理方法,当添加一个行为的时候,就是绑定了该behavior中的多个事件

    5.yiiaseModule


    从模块中使用__get..可以直接获取模块中的组件

    getComponent...会在第一次的时候实例化组件

    setComponent 只是将组件的类名保存起来

    preloadComponents 会通过配置中的preload属性的id使用getComponent实例化..同时使用getModule进行模块实例化并保存

    getModule 如果是加载子模块,会先加载父模块..再加载子模块.

    setModule 将模块名字保存到_modules中


    _basePath 模块路径,没有在配置中设置的话,就会反射类名使用dirname取得目录名

    _controllerPath 没有设置的话会_basePath/controllers

    _viewPath 没有设置的话会是_basePath/views

    _layoutPath 没有设置的话会是 _viewPath/layouts


    defaultRoute="default" 默认路由


    runAction($route,$params)--------------- Yii::$app->controller

    1.createController(route) 返回控制器和action
    2.$controller->runAction($actionID, $params);返回结果
    3.在动作执行完后,会重设Yii::$app->controller为原来的控制器


    createController($route)

    1.route为空的话.使用defaultRoute 即是default
    2.对route进行分割..获取id(模块id||控制器id)和action
    3.如果确实有getModule(id).则使用module创建控制器
    4.controllerMap有该id则创建控制器
    5.根据controllerPath,查找是否有该控制器.有的话则实例化.并将id和模块传入构造函数.
    6.返回控制器和action.


    6.yiiaseController


    runAction ---- Yii::$app->requestedAction---- $this->action
    1.使用createAction创建动作.
    2.会触发actionEvent中的Application::EVENT_BEFORE_ACTION事件,这里可操作事件的isValid属性.
    3.会执行该控制器所属模块的beforeAction方法$this->module->beforeAction..触发自身的self::EVENT_BEFORE_ACTION事件
    4.会执行该控制器的$this->beforeAction方法..
    5.如果上面三个都是返回true的话,则 $action->runWithParams($params);
    6.执行控制器的afterAction函数,触发自身的self::EVENT_AFTER_ACTION事件
    7.执行模块的afterAction函数
    8.触发Application::EVENT_AFTER_ACTION事件

    9.在动作执行完后,会重设$controller->action为原来的动作


    createAction

    1.action为空的话.为defaultAction为 index

    2.如果$actionMap中含有的话则..实例化动作

    3.action+动作id..如果控制器中有该方法,则创建InlineAction($id,$this,$methodName)


    7.yiiaseApplication

    比模块多了错误处理.和注册了CoreComponents

    log errorHandler formatter i18n urlManager view

    initExtensions

    会将扩展文件中的别名设置


    run();

    触发 EVENT_BEFORE_REQUEST

    执行handleRequest(请求组件)获取响应..

    触发 EVENT_AFTER_REQUEST

    $response->send();

    8. yiiwebApplication

    注册了核心组件 request response session user assetManager

    defaultRoute 为site

    $_homeUrl 主页地址.可设置.不设置为scripturl

    handleRequest

    1.设置@webroot和@web为scriptfile和baseurl
    2.使用请求组件解析url返回路由..或者使用catchAll返回路由..catchAll可以作为一个动作进行特殊处理例如,网站关闭则xxx.不关闭则使用$request->resolve()

    3.执行 runAction.如果返回的数据继承与Response.则直接返回.

    4.如果返回的数据不是response则把数据设置为response的data.再返回

  • 相关阅读:
    自定义布局模板
    单据状态图
    初识MongoDB(八)
    初识MongoDB(七)
    初识MongoDB(六)
    初识MongoDB(五)
    初识MongoDB(四)
    初识MongoDB(三)
    初识MongoDB(二)
    初识MongoDB(一)
  • 原文地址:https://www.cnblogs.com/zhepama/p/3541198.html
Copyright © 2011-2022 走看看