Yii框架是我成為PHP程序員以來,深入使用的第一款框架。我喜歡這個框架,是因為這框架體在用于快速原型實現的時候,異常的好用。但是這款框架絕非完美,比如它的Model設計。
在業務實踐過程中,我發現一種常見的Pattern,并非是技術上的,而是運營上的,我所在的團隊和后續我將要參與的團隊,我都會建議他們在做業務站點的同時,配套實現一個運維站點,這樣可以更好、并且以更低成本地去運維一個業務。關于這個配套的問題,本文不講,提一下是因為,要實現這個配套運維的站點,我們需要將一部分業務邏輯拷貝到里面。
因為Model里面實現了主要的業務邏輯,所以,自然而然的,運維站點也需要用到相同的Model,但是因為運維站點事關重大,一般不會部署到公網服務器,所以項目代碼上也是分離的,這時候,就需要同一個Model兩頭使用,最差的做法是兩邊拷貝,更好的做法,是通過鏈接來兩邊復用。
這時候,問題就出現了。因為我發現Model的設計,耦合很嚴重,主要就是Yii框架的核心配置文件,Model鏈接的數據庫,是通過配置文件指定的。但是它的配置方式又比較奇怪,就是所有的Model都默認連接同一個數據庫,所以,在配置文件里,并沒有指明Model和數據庫的映射關系,只是說明了數據庫的連接信息。
而實際業務實現中,沒有什么時候,只用一個數據庫就可以搞定所有業務的,這本身就是把雞蛋放一個籃子,自找麻煩。當數據庫多了以后,發現Model不能連接多數據庫,麻煩就大了。這個時候,只能把Model和數據庫的映射關系寫在Model里面,然后Model就耦合了數據庫連接的名字。嚴重限制了它的復用性。
因為一般我們在業務側,Model連接主庫,到了運維側,如非必要,Model會連接從庫,這個時候,數據庫連接的名字不一樣,不管怎么調整配置文件,一定會沖突,所以就不得不用一些很tricky的手段去解決這種問題。而這種tricky手段稍有不慎,就進一步破壞了項目的代碼的可復用性。
關于這個,我還沒有什么太好的方案,我也只能指出,其設計上的缺陷。
最后,這個文章我也不指望有人能看懂了,就是自己在實現業務的時候的一點想法,或許,后續等我經驗足夠了,我真的會自己出來實現一個框架,把這些都解決,記錄下來,我至少知道,問題在哪里。