1. 程式人生 > >Yii2基本概念之——生命周期(LifeCycle)

Yii2基本概念之——生命周期(LifeCycle)

運行機制 cor 插入數據 改變 行為 用戶登錄 save 事件處理 xxx

人有生老病死,一年有春夏秋冬四季演替,封建王朝有興盛、停滯、衰亡的周期律——“其興也勃焉,其亡也忽焉”。換句話說,人,季節,王朝等等這些世間萬物都有自己的生命周期。同樣地,在軟件行業,一個系統,一個組件,一個功能,一個類都是有自己的生命周期的。

那麽,為什麽要從生命周期的這個角度去理解程序?
在現實世界中如果你使用一個工具,當你理解工具的工作原理的時候你使用起來無疑更加有信心、更加得心應手;應用的開發與此如出一轍,當你理解框架的運行機制時,你開發起來就會如行雲流水,寫起代碼汪洋恣肆一發不可收拾。

每個程序的運行,要理解為一個過程或者流程。復雜的東西理解起來困難,我們分成若幹個階段來理解豈不是就簡單許多了嗎?除了我們更好的去理解程序的運行流程,更為重要的是還能夠使我們能夠“介入”這個流程,改變這個流程,從而實現我們的目的。

我們平時經常用的操作,比如ActiveRecord的insert操作,仿佛就是一步到位完成了。但其實我們深入到框架內部就會發現,其實看似插入數據這麽一個簡單的操作,還是分為幾步完成的。beforeValidate->afterValidate->beforeSave->afterSave等階段,從beforeXxx和afterXxx也可以看出一點端倪。到最後,其實是執行的SQL的insert語句,前面的無非是做了些面向對象的封裝而已。那麽,這些操作加之insert語句的執行,對於Yii2來講已經是“原子操作”,不能再分割了。這些操作,構成了insert操作的生命周期。當然,生命周期也是有層次之分的,對於Yii2來說SQL insert語句是原子操作不可分割,但是對於MySQL本來來說,intert操作又可以分為幾個階段,也有其生命周期。因此,生命周期是相對的,抽象層次不同,生命周期也是不一樣的。

另一個常見的例子是,應用本身(Application),Yii2官網有說明,我們不在贅述,任何想要學習Yii2的小夥伴都繞不開這個。我們這裏僅僅介紹一下另一個有代表性的類——用戶認證類User。看看它的生命周期是怎麽樣的。
User用來管理用戶的登錄/登出,在其中定義了四個基本事件:

    const EVENT_BEFORE_LOGIN = ‘beforeLogin‘;
    const EVENT_AFTER_LOGIN = ‘afterLogin‘;
    const EVENT_BEFORE_LOGOUT = ‘beforeLogout‘;
    const EVENT_AFTER_LOGOUT = ‘afterLogout‘;

顧名思義,就是登錄前,登錄後,登出前,登出後。這是四個事件,這些連同登錄/登出動作本身,構成了用戶登錄行為的完整周期。

按照Yii2一貫的優良作風。這個登錄/登出認證操作完全可以視作一個完整的過程,在這個過程的重要節點上標註事件,再事件上添加事件處理器。從而完成對整個過程的控制——是否繼續執行,添加額外的動作等等。你可以通過響應這些事件來實現一些類似登錄統計、在線人數統計的功能。例如, 在登錄後 yii\web\User::EVENT_AFTER_LOGIN 的事件處理器,你可以將用戶的登錄時間和IP記錄到 user 表中,也可以在EVENT_AFTER_LOGINEVENT_AFTER_LOGINOUT的事件處理器來記錄在線人數。

因此,了解每個重要功能的生命周期,其實就是掌握其內在運行的機制,從而不再視其為“原子操作”,從而使我們能介入它、改變它,使之更好的為我們服務。

Yii2基本概念之——生命周期(LifeCycle)