• yii框架源码分析之Yii::createWebApplication()>run() 执行过程分析


    简介:这是yii框架源码分析之Yii::createWebApplication()->run() 执行过程分析的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=339669' scrolling='no'>
    // index.php

    Yii::createWebApplication()->run();
    // CApplication.php

    public function run()
    {
    if($this->hasEventHandler('onBeginRequest'))
    $this->onBeginRequest(new CEvent($this));
    $this->processRequest();
    if($this->hasEventHandler('onEndRequest'))
    $this->onEndRequest(new CEvent($this));
    }

    // CApplication.php

    $this->processRequest();
    // CWebApplication.php

    public function processRequest()
    {
    if(is_array($this->catchAllRequest) && isset($this->catchAllRequest[0]))
    {
    $route=$this->catchAllRequest[0];
    foreach(array_splice($this->catchAllRequest,1) as $name=>$value)
    $_GET[$name]=$value;
    }
    else
    $route=$this->getUrlManager()->parseUrl($this->getRequest());
    $this->runController($route);
    }
    // CApplication.php

    $route=$this->getUrlManager()->parseUrl($this->getRequest());
    // CApplication.php

    $this->getUrlManager()
    $this->getRequest()
    // CWebApplication.php

    public function getRequest()
    {
    return $this->getComponent('request');
    }
    public function getUrlManager()
    {
    return $this->getComponent('urlManager');
    }
    // CApplication.php

    $this->getComponent('request');
    // CModule.php

    public function getComponent($id,$createIfNull=true)
    {
    if(isset($this->_components[$id]))
    return $this->_components[$id];
    else if(isset($this->_componentConfig[$id]) && $createIfNull)
    {
    $config=$this->_componentConfig[$id];
    if(!isset($config['enabled']) || $config['enabled'])
    {
    Yii::trace("Loading \"$id\" application component",'system.CModule');
    unset($config['enabled']);
    $component=Yii::createComponent($config);
    $component->init();
    return $this->_components[$id]=$component;
    }
    }
    }
    // CModule.php

    $config=$this->_componentConfig[$id];
    $component=Yii::createComponent($config);
    $component->init();
    return $this->_components[$id]=$component;
    // CWebApplication.php

    return $this->getComponent('request');
    // CHttpRequest.php

    public function init()
    {
    parent::init();
    $this->normalizeRequest();
    }
    // CHttpRequest.php

    $this->normalizeRequest();
    // CHttpRequest.php

    protected function normalizeRequest()
    {
    // normalize request
    if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
    {
    if(isset($_GET))
    $_GET=$this->stripSlashes($_GET);
    if(isset($_POST))
    $_POST=$this->stripSlashes($_POST);
    if(isset($_REQUEST))
    $_REQUEST=$this->stripSlashes($_REQUEST);
    if(isset($_COOKIE))
    $_COOKIE=$this->stripSlashes($_COOKIE);
    }

    if($this->enableCsrfValidation)
    Yii::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));
    }
    // CApplication.php

    return $this->getComponent('urlManager');
    // CUrlManager.php

    public function init()
    {
    parent::init();
    $this->processRules();
    }
    // CUrlManager.php

    $this->processRules();
    // CUrlManager.php

    protected function processRules()
    {
    if(empty($this->rules) || $this->getUrlFormat()===self::GET_FORMAT)
    return;
    if($this->cacheID!==false && ($cache=Yii::app()->getComponent($this->cacheID))!==null)
    {
    $hash=md5(serialize($this->rules));
    if(($data=$cache->get(self::CACHE_KEY))!==false && isset($data[1]) && $data[1]===$hash)
    {
    $this->_rules=$data[0];
    return;
    }
    }
    foreach($this->rules as $pattern=>$route)
    $this->_rules[]=$this->createUrlRule($route,$pattern);
    if(isset($cache))
    $cache->set(self::CACHE_KEY,array($this->_rules,$hash));
    }
    // CApplication.php

    $route=$this->getUrlManager()->parseUrl($this->getRequest());
    // CUrlManager.php
    // CUrlManager::parseUrl()

    public function parseUrl($request)
    {
    if($this->getUrlFormat()===self::PATH_FORMAT)
    {
    $rawPathInfo=$request->getPathInfo();
    $pathInfo=$this->removeUrlSuffix($rawPathInfo,$this->urlSuffix);
    foreach($this->_rules as $rule)
    {
    if(($r=$rule->parseUrl($this,$request,$pathInfo,$rawPathInfo))!==false)
    return isset($_GET[$this->routeVar]) ? $_GET[$this->routeVar] : $r;
    }
    if($this->useStrictParsing)
    throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
    array('{route}'=>$pathInfo)));
    else
    return $pathInfo;
    }
    else if(isset($_GET[$this->routeVar]))
    return $_GET[$this->routeVar];
    else if(isset($_POST[$this->routeVar]))
    return $_POST[$this->routeVar];
    else
    return '';
    }
    // CWebApplication.php

    $this->runController($route);
    // CWebApplication.php

    public function runController($route)
    {
    if(($ca=$this->createController($route))!==null)
    {
    list($controller,$actionID)=$ca;
    $oldController=$this->_controller;
    $this->_controller=$controller;
    $controller->init();
    $controller->run($actionID);
    $this->_controller=$oldController;
    }
    else
    throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
    array('{route}'=>$route===''?$this->defaultController:$route)));
    }
    // CWebApplication.php

    $ca=$this->createController($route)
    // CWebApplication.php

    public function createController($route,$owner=null)
    {
    if($owner===null)
    $owner=$this;
    if(($route=trim($route,'/'))==='')
    $route=$owner->defaultController;
    $caseSensitive=$this->getUrlManager()->caseSensitive;

    $route.='/';
    while(($pos=strpos($route,'/'))!==false)
    {
    $id=substr($route,0,$pos);
    if(!preg_match('/^\w+$/',$id))
    return null;
    if(!$caseSensitive)
    $id=strtolower($id);
    $route=(string)substr($route,$pos+1);
    if(!isset($basePath)) // first segment
    {
    if(isset($owner->controllerMap[$id]))
    {
    return array(
    Yii::createComponent($owner->controllerMap[$id],$id,$owner===$this?null:$owner),
    $this->parseActionParams($route),
    );
    }

    if(($module=$owner->getModule($id))!==null)
    return $this->createController($route,$module);

    $basePath=$owner->getControllerPath();
    $controllerID='';
    }
    else
    $controllerID.='/';
    $className=ucfirst($id).'Controller';
    $classFile=$basePath.DIRECTORY_SEPARATOR.$className.'.php';
    if(is_file($classFile))
    {
    if(!class_exists($className,false))
    require($classFile);
    if(class_exists($className,false) && is_subclass_of($className,'CController'))
    {
    $id[0]=strtolower($id[0]);
    return array(
    new $className($controllerID.$id,$owner===$this?null:$owner),
    $this->parseActionParams($route),
    );
    }
    return null;
    }
    $controllerID.=$id;
    $basePath.=DIRECTORY_SEPARATOR.$id;
    }
    }
    // CWebApplication.php

    $oldController=$this->_controller;
    $this->_controller=$controller;
    $controller->init();
    $controller->run($actionID);
    $this->_controller=$oldController;
    // CWebApplication.php

    $controller->run($actionID);
    // CController.php

    public function run($actionID)
    {
    if(($action=$this->createAction($actionID))!==null)
    {
    if(($parent=$this->getModule())===null)
    $parent=Yii::app();
    if($parent->beforeControllerAction($this,$action))
    {
    $this->runActionWithFilters($action,$this->filters());
    $parent->afterControllerAction($this,$action);
    }
    }
    else
    $this->missingAction($actionID);
    }

    转载自 jKey Blog 

    本文链接地址: http://blog.jkey.lu/yii-createwebapplication-run/

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/339669.html pageNo:7
  • 相关阅读:
    hugo博客使用 utterances 作为评论系统
    使用DEM生成彩色的立体图像
    hibernate Annotation 注解形式 实例 事务 hibernate.cfg.xml
    web.xml配置webAppRootKey 的问题
    JAVA 生成二维码 代码
    关于Boost库的split函数在不同的编译器下的使用
    纯 hibernate hibernate.cfg.xml 事务 数据库操作 CRUD
    Android 百度地图API 定位 导航 代码
    Android GPS
    使用GDAL对DEM进行彩色渲染
  • 原文地址:https://www.cnblogs.com/ooooo/p/2245256.html
Copyright © 2020-2023  润新知