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初始化
網站當然主要的事情就是處理請求了,處理請求就出現了幾個物件,Route,UrlManager,Request這些也都是元件,每個負責自己的事情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); }
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
以太坊原始碼解讀(5)BlockChain類的解析及NewBlockChain()分析
一、blockchain的資料結構 type BlockChain struct { chainConfig *params.ChainConfig // 初始化配置 cacheConfig *CacheConfig // 快取配置 db ethdb.Databas
以太坊原始碼解讀(4)Block類及其儲存
一、Block類 type Block struct { /******header*******/ header *Header /******header*******/ /******body*********/ uncle
以太坊原始碼解讀(6)blockchain區塊插入和校驗分析
以太坊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的一個最