目錄2. 設計模式
3. 請求與響應
4. 資料庫
5. 總結
yii2
框架是乙個非常龐大但是並不臃腫的php
框架。
使用yii2
框架,可以極大的提公升開發效率。
秉持著要知其然也要知其所以然的思想,花了一周的時間,看了 linuor 的 《深入理解yii2.0》
根據我的理解梳理了一下yii2
框架的整體結構。
此後簡稱框架。
此框架的三個基礎概念:
畢竟三生萬物。
一看到這個詞可能很迷惑,那麼什麼是屬性呢。
比如說,你現在正在玩一款角色扮演的遊戲,角色雙手分別有一把十方大劍
,乙個十方盾牌
。
那麼從物件導向的角度而言,你的角色類需要有左手**
和右手**
兩個成員變數。
並且角色類可以從左手**
和右手**
中獲得 力量屬性。
這麼一說屬性這一概念,就很容易理解了。
還是以角色扮演遊戲為例(這裡要對不起不玩遊戲的朋友了,原諒我匱乏的想象力,或者你有好的比喻也可以跟我說),遊戲裡面都有任務系統,而任務會分為主線任務和支線任務,在做主線任務是通常會觸發一系列的支線任務。這些支線任務的觸發就可以認為是一系列的事件。
框架的行為也可以使用角色扮演遊戲來舉例,你在 無盡荒原 撿到了一本魔法書,學會了禁咒魔法,召喚神龍
。
於是你把程式一改,給你的類加乙個召喚魔法的方法,這是不可能的。我們必須讓你的類擁有乙個動態新增方法的功能,於是所有拿到魔法書的人或者限定職業的人,都能學會這個禁咒,這就是行為
的作用,動態給類增加方法。
以上,有了這三個 框架 實現的**,我們才能更快速和靈活的搭建上層的程式。
框架採用了現在世面上面最常見的一種模式,mvc
模式,具體細節不再闡述,現在網上關於mvc
的介紹可以說是爛大街了。
mvc
只是一種大框架上的設計模式,其核心思想是分層,最終目的是解耦。框架在mvc
的基礎上,應用了很多經典的設計模式以及後來發展的設計模式。
其中最重要的就是:
那麼什麼是依賴注入呢
先來一段沒有依賴注入的**:
<?php
// 這段**將 db1 中的t1表的資料備份到 db2 庫的 t2 中。
// 所使用的變數都在邏輯過程中申請。
class archive
die("備份完成");}}
那麼如果再來乙個需求,讓你把db3
的資料備份到db4
中,邏輯相同,那麼你該怎麼辦呢?
有道友就說了,那還不簡單,copy & paste
,搞定。
於是,你多了乙個方法或者乙個類。
一直到你的方法和類增加到 10 個以上時,你都不會有什麼感覺。
直到產品說現在需求變了,讓你把所有的備份庫都改成 db3,那麼,你就要把手頭的工作都停下來,然後將**中的備份庫全改成 db3。
而且,如果你使用的是靜態語言,那麼,你就要把**再重新編譯一遍。關於靜態語言的編譯時長:為什麼c編譯需要這麼長時間
那麼就有了下面這種:
class archivenew
die("備份完成");
}/**
* @param mixed $origindb
*/public function setorigindb($origindb)
/*** @param mixed $backdb
*/public function setbackdb($backdb)
}
這個方法,把所有的需要用到的資料庫都放到了外面來進行管理,那麼我們稱這幾個資料庫為依賴,稱在外部設定資料庫的行為為依賴注入。
這只是一種很原始的使用方式,你可以繼續延伸,將外部依賴放到統一的地方去管理,那麼就有了注入容器(di container)
服務定位器像是乙個註冊中心,向服務定位器中註冊乙個 a 服務,可以使用 a 這個名字從服務定位器中取出這個服務。
$locator = new servicelocator;
$locator->set('a');
$locator->get('a');
服務定位器是基於依賴注入的,在獲取服務時,其實會在容器中先註冊乙個服務。
這一節其實主要講的就是請求。
請求的內容會比較多,還涉及到網路協議等知識,這裡不再展開。
列舉一下重要的幾點:
路由美化 (將原始的路由修改成比較美觀的位址,見導圖 請求部分)
url
解析(將美化過的路由解析成原始請求)
請求管理 (包括請求頭部,請求體,解析器等等)
雖然這張圖有些搞笑,但是無疑說明了 資料庫(mysql
)對於php
的重要性。
框架為了相容各種資料庫,對資料型別做了多層封裝,並且做了一系列的轉換規則:
框架支援事務巢狀,但是巢狀的事務必須成對出現(注意!!!)。
看到事務這一節的時候,正巧同事出了乙個bug
,在指令碼的迴圈中,出錯之後沒有commit
或者rollback
,導致,接下來的生成的事務都成了這個事務的子事務。而框架的巢狀事務,實際上是使用**模擬的,如果父事務沒有提交,那麼子事務永遠不會提交。
const event_init = 'init'; // 初始化物件時觸發
const event_after_find = 'afterfind'; // 執行查詢結束時觸發
const event_before_insert = 'beforeinsert'; // 插入結束時觸發
const event_after_insert = 'afterinsert'; // 插入之前觸發
const event_before_update = 'beforeupdate'; // 更新記錄前觸發
const event_after_update = 'afterupdate'; // 更新記錄後觸發
const event_before_delete = 'beforedelete'; // 刪除記錄前觸發
const event_after_delete = 'afterdelete'; // 刪除記錄後觸發
這些事件和其他事件沒有什麼分別,都是在特定的時候會執行,就不一一闡述了。
框架自帶了樂觀鎖的實現,如果有類似需求,可以在過載yii\db\activerecord::optimisticlock()
方法,返回資料庫中的版本號字段即可。在更新與刪除時,框架會做相應的操作,來保證,更新的資料是自己拿到的資料,而不是被別人給修改過了。
因為悲觀鎖不適用於web
應用,所以框架並沒有實現悲觀鎖。
yii2框架安裝
下面我把完整的安裝流程介紹給大家 前提 非常重要,你的php版本必須是php5.4以上 去這裡現在高階應用模板 cmd dos命令進入這個d wamp www yii2 advanced下 3.執行 php r readfile php 5.執行php composer.phar global re...
yii2框架 yii2自身的自動載入 三
上一節說完了composer的自動載入,下面我們來說一下yii2自身的自動載入。在我們的入口檔案,例如index.php,如下 comment out the following two lines when deployed to production defined yii debug or d...
yii2框架 yii2的asset資源包 十一
link license license use yii web assetbundle author qiang xue since 2.0 定義按需載入css方法,注意載入順序在最後 public static function addcss view,cssfile 將需要載入的檔案已陣列聚合...