1. 程式人生 > >YII1.1原始碼解讀(1)

YII1.1原始碼解讀(1)

先放關係圖:


這些元件是在CWebApplication初始化時載入的,而且CWebApplication控制著他們的生命週期,所以這裡用組合關係

YiiBase我認為是一個容器,也是一個單例模式,也是一個工廠,他第一件事就是生產網站,網站作為一個元件被生產出來

那麼做為一個容器,應該儘可能的為他生產出來的類提供一些必要的功能,比如

引入檔案的方法

public static function import($alias,$forceInclude=false)
生成類的方法
public static function autoload($className,$classMapOnly=false)

Yii::createWebApplication($config)->run();
YiiBase.php
	public static function createWebApplication($config=null)
	{
		return self::createApplication('CWebApplication',$config);
	}


YiiBase就像一個盡職的父母,主要了下幾件事:

1.父類CApplication初始化

    public function __construct($config=null)
    {
        //....省略程式碼

        $this->preinit();

        $this->initSystemHandlers();
        $this->registerCoreComponents();//1

        $this->configure($config);//2
        $this->attachBehaviors($this->behaviors);//3
        $this->preloadComponents();//4

        $this->init();
    }

  1)載入CApplication(載入了db,urlManager,request等),CWebApplication(載入了session,assetManager,clientScript等我只寫比較重要的)執行所需要的元件

  2)設定配置檔案,這裡配置是網站的配置,所以要在WebApplication裡配置,而不是YiiBase

  3)設定行為方法

  4)載入靜態元件,這裡沒有設定

  5)執行實現類的init方法,也可以說是延遲實現

2、建立CWebapplication初始化

	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);
	}
網站當然主要的事情就是處理請求了,處理請求就出現了幾個物件,Route,UrlManager,Request這些也都是元件,每個負責自己的事情
catchAllRequest //維護相關的就不說了
先看
public function getRequest()
    {
        return $this->getComponent('request');
    }
WebApplication自己動手豐衣足食,他自己用到的元件他自己去拿,但是他還是用了YiiBase提供的工具import和autolod來載入,這個getComponent是他爺爺類那繼承來的CModule,也就是他爺爺那輩開始就知道跟YiiBase這個容器打交道。

看一下他爺爺留下的經驗,怎麼載入元件的:

	public function getComponent($id,$createIfNull=true)
	{
		if(isset($this->_components[$id]))
			return $this->_components[$id];
		elseif(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;
			}
		}
	}
拿前面我們給網站的config裡一段配置來說
	// application components
	'components'=>array(
		'user'=>array(
			// enable cookie-based authentication
			'allowAutoLogin'=>true,
		),
		'db'=>array(
			'connectionString' => 'sqlite:protected/data/blog.db',
			'tablePrefix' => 'tbl_',
		),
		// uncomment the following to use a MySQL database
		/*
		'db'=>array(
			'connectionString' => 'mysql:host=localhost;dbname=blog',
			'emulatePrepare' => true,
			'username' => 'root',
			'password' => '',
			'charset' => 'utf8',
			'tablePrefix' => 'tbl_',
		),
		*/
		'errorHandler'=>array(
			// use 'site/error' action to display errors
			'errorAction'=>'site/error',
		),
		'urlManager'=>array(
			'urlFormat'=>'path',
			'rules'=>array(
				'post/<id:\d+>/<title:.*?>'=>'post/view',
				'posts/<tag:.*?>'=>'post/index',
				'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
			),
		),
$config=$this->_componentConfig[$id];
這裡的$id就是這個數組裡的db,urlManager的key,config自然就是對應的陣列,有了這些就知道用哪個類去實現元件,還有元件需要的引數。
那麼接下來,我們看這個Request這個元件的在init做了什麼
	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'));
	}

對引數做了過濾。其他的沒做什麼。

先寫到這,第一次寫這麼長的文章,可能有點膚淺,下次爭取寫的更好~~


相關推薦

YII1.1原始碼解讀1

先放關係圖: 這些元件是在CWebApplication初始化時載入的,而且CWebApplication控制著他們的生命週期,所以這裡用組合關係 YiiBase我認為是一個容器,也是一個單例模式,也是一個工廠,他第一件事就是生產網站,網站作為一個元件被生產出來 那麼做為

ORB-SLAM2原始碼解讀1:系統入口System

   先要拿大名鼎鼎的ORB-SLAM系統框圖鎮樓,看著這張圖能夠完美的串起來整個流程。 ORB-SLAM分三個執行緒,分別是Tracking、LocalMapping和LoopClosing。 (1)Tracking:在主執行緒上,輸入視訊流,輸出相機位姿並跟蹤區域

以太坊原始碼解讀1以太坊核心概念

一、定義 以太坊是一個開源的帶有智慧合約功能的公共區塊鏈平臺。 特點: 1、支援智慧合約,以太坊不是給使用者一系列預先設定好的操作,而是充分允許使用者按照自己的意願建立複雜的邏輯操作; 2、以太坊同時還構建了較完整的、開源的生態系統:有底層的geth、程式設計的solid

Hikaricp原始碼解讀1——簡介

1、簡介 HikariCP是一款高效穩定的資料庫連線池,效能方面與其他同類產品相比能高出近10倍,尤其連線取用的設計極大的提高可靠性,對於資料庫連線中斷的情況,通過測試getConnection(),各種CP的不相同處理方法如下: (所有CP都配置了跟con

Selenium2Library原始碼解讀1- 概述

概述 官方文件這樣描述Selenium2Library: Selenium2Library is a web testing library for Robot Framework. It uses the Selenium 2 (WebDriver) libraries

以太坊原始碼解讀5BlockChain類的解析及NewBlockChain()分析

一、blockchain的資料結構 type BlockChain struct { chainConfig *params.ChainConfig // 初始化配置 cacheConfig *CacheConfig // 快取配置 db ethdb.Databas

以太坊原始碼解讀4Block類及其儲存

一、Block類 type Block struct { /******header*******/ header *Header /******header*******/ /******body*********/ uncle

以太坊原始碼解讀6blockchain區塊插入和校驗分析

以太坊blockchain的管理事務: 1、blockchain模組初始化 2、blockchain模組插入校驗分析 3、blockchain模組區塊鏈分叉處理 4、blockchian模組規範鏈更新 上一節分析了blockchain的初始化,這一節來分析blockchain區塊的插入和校驗

以太坊原始碼解讀7以太坊的P2P網路基礎

一、分散式網路的來歷 基於P2P技術的應用有很多,包括檔案分享,即時通訊,協同處理,流媒體通訊等等。其中檔案分享和下載是p2p技術最集中體現。其中,DHT技術是目前很多分散式系統所普遍採用的方案,也包括以太坊。所以這裡先要對DHT技術有所瞭解。 二、DHT(Distributed Ha

原始碼解讀:String類

曾聽過這麼一句話,美的東西看多了,自己創作的東西也會有所提高。我們的程式設計亦是如此,多看看大神的程式碼,欣賞他們的程式設計藝術,對我們的程式設計會有很大的幫助。而很多人經常忽略這一點,今天就讓ShowTime給大家送上第一道JDK大餐——解讀String類。 第一步看看String

vue原始碼解讀

vue原始碼的目錄結構 vue原始碼根目錄下有很多資料夾,以下是各資料夾存放的檔案說明 Vue     |— build 打包相關的配置檔案,其中最重要的是config.js。主要是根據不同的入口,打包為不同的檔案。  &nbs

以太坊原始碼解讀9以太坊的P2P模組解析——底層網路構建和啟動

以太坊的底層p2pServer,大約可以分為三層: 1、底層:table物件、node物件,它們分別定義了底層的路由表以及本地節點的資料結構、搜尋和驗證;     1)database.go         //封裝node資料庫相關操作     2)node.go 

Netty原始碼解讀Netty與Reactor模式

一:Netty、NIO、多執行緒? 時隔很久終於又更新了!之前一直遲遲未動也是因為積累不夠,後面比較難下手。過年期間@李林鋒hw釋出了一個Netty5.0架構剖析和原始碼解讀 ,看完也是收穫不少。前面的文章我們分析了Netty的結構,這次咱們來分析最錯綜複雜的一部分-Netty中的多執行緒以

Netty原始碼解讀概述

感謝網友【黃億華】投遞本稿。 Netty和Mina是Java世界非常知名的通訊框架。它們都出自同一個作者,Mina誕生略早,屬於Apache基金會,而Netty開始在Jboss名下,後來出來自立門戶netty.io。關於Mina已有@FrankHui的Mina系列文章,我正好最近也要做一些網路

以太坊原始碼解讀2以太坊客戶端geth原始碼目錄解析

下面我們來從Geth原始碼的目錄來看看以太坊都有哪些模組。 一、目錄分析 go-etherreum-master |- accounts /* 實現了高層級Ethereum賬號管理 */ | |- abi // 該包實現了Ether

以太坊原始碼解讀8以太坊的P2P模組解析——節點發現和K-桶維護

回顧一下,前面說到以太坊分散式網路採用了Kademlia協議,它的特點是: 1、採用了二叉樹的拓撲結構; 2、每個節點都對整樹進行拆分,分成n棵子樹; 3、從每棵樹中取K個節點,構成“k-桶”,每個節點控制著n個k-桶; 4、節點的距離是通過異或的二進位制運算得到的; 5、k

以太坊原始碼解讀3以太坊啟動流程簡析

啟動命令: geth --identity "TestNode1" --datadir "data0" --rpc --rpcapi "db,eth,net,web3" --port "30303" --networkid "29382" --ws --wsorigins

Netty原始碼解讀Channel與Pipeline

Channel是理解和使用Netty的核心。Channel的涉及內容較多,這裡我使用由淺入深的介紹方法。在這篇文章中,我們主要介紹Channel部分中Pipeline實現機制。為了避免枯燥,借用一下《盜夢空間》的“夢境”概念,希望大家喜歡。 一層夢境:Channel實現概覽 在Netty裡,

Netty原始碼解讀Netty中的buffer

感謝網友【黃億華】投遞本稿。 上一篇文章我們概要介紹了Netty的原理及結構,下面幾篇文章我們開始對Netty的各個模組進行比較詳細的分析。Netty的結構最底層是buffer模組,這部分也相對獨立,我們就先從buffer講起。 What: buffer二三事 buffer中文名又叫緩衝區,按

jquery3.0原始碼解讀Selector

前置知識 正則表示式 css選擇器 DOM call 程式碼概況 第一節將jQuery初始化的時候,我們只是簡單講了下jQuery的構造方式,並沒有分析jQuery物件到底是如何具體構造出來的。 使用過jquery的同學一定知道,jquery的一個最