Phalcon如何切換數據庫《Phalcon入坑指南系列 三》
本系列目錄
一、Phalcon在Windows上安裝 《Phalcon入坑指南系列 一》
二、Phalcon入坑必須知道的功能(項目配置、控制器、模型、增、刪、改、查)
三、Phalcon如何切換數據庫《Phalcon入坑指南系列 三》
複製標題直接搜索即可
前言
在以前的項目中大多數都是一個庫就搞定了,很少遇到多庫操作的。
ThinkPHP框架對於多庫說的非常明白,但是這個Phalcon框架多庫就不是那麼容易了。
接下來看看Phalcon框架針對於跨庫如何操作。
一、解析Phalcon數據庫連接實現
之前學的東西不能忘,先使用命令來生成一個控制器phalcon create-controller –name 文件名
接着使用命令行創建出一個模型文件。
這個模型文件裡邊的內容先不去管它,下文咔咔在慢慢的解釋哈!
根據config目錄下的配置可以得知!目前系統中使用的默認數據庫test
現在項目中需要別的數據庫數據應該怎麼弄呢?看了文檔是不是也很迷惑。
迷惑就對了,剛剛接觸一個新的框架不迷惑才怪呢!
根據初步讀取文檔得到的信息就是在server文件裡邊進行了數據庫連接。
那麼就很簡單了,它原始的是怎麼弄的,現在就照貓畫虎唄!
首先對連接初始數據庫做一個簡單的解析。
先看第一句$config = $this->getConfig();
這個看名字就知道是獲取配置,獲取的當然也是config文件。
接着$class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
這一句估計有部分人會有點懵,對於這塊看不明白。
其實很簡單的,可以到config文件中看一下是什麼。
這不就很清晰了,就是數據庫類型唄!
變量param就不做解釋了,就是進行簡單的賦值而已。
最重要的是最後一行代碼return new $class($params);
,你要明白這個時候的class是什麼,也就是$class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
這塊東西會返回什麼。
通過讀取配置文件可以得知就是Phalcon\Db\Adapter\Pdo\MySQL
結合起來。
接着你就可以追溯到這個類裡邊去了
注釋都寫的明明白白的,用起來就是先引入MySQL類,然後實例化即可。
二、設置切換數據庫連接
看了上文Phalcon對於默認數據庫的連接方式,那麼你有想法了嗎?
沒有想法的話,再給你簡化一下流程。
數據庫默認配置文件config.php -> server.php讀取config的配置信息 -> 通過類Phalcon\Db\Adapter\Pdo\Mysql
來實現連接。
既然咱們要做,對應的點就是server.php
根據上圖可以看到,所有的配置信息都是直接寫進去的,並沒有從配置文件中讀取。
今天要做的事情是多庫切換連接,為的是實現,優化工作後期做,並且也不會直接使用今天的這種方式來處理的。
然後回到創建的server模型中,進行設置此模型使用的數據庫名即可
接着來到控制器中,先將version模型給實例化出來。
然後直接調用find方法,查詢id為1的數據。
看一下打印結果
再來對比一下跟數據庫的數據是否一一對應。
三、設置了多庫連接對默認連接的庫是否有影響
此時估計很多小夥伴會引發出這個問題,那麼不妨來進行測試一下。
可以切換到我們之前文章寫的index控制器
暫且就先看index這個方法
瀏覽器執行一下,看一下返回結果
不放心的話可以再看一下對應的數據庫對應的表數據
這下就可以放心了,到此本節主題多庫怎麼切換連接就說明完了。
四、疑問解答($di = new FactoryDefault())
在Phalcon中我們看到了使用了$di->setShared
,對於這個di很多人都不明白其怎麼回事。
在這之前咔咔略微的對ThinkPHP的源碼看了一遍,發現其功能就類似於ThinkPHP的容器概念。
在ThinkPHP中容器是使用了註冊樹模式,需要使用對應對象實例的時候就可以直接獲取,這樣就避免了一個類反覆的創建。這就是其中的一個優點。
通過對Phalcon源碼的追蹤發現也是實現類似的功能,在容器中註冊一個服務。就跟ThinkPHP通過註冊樹設計模型來對註冊類進行保存。
服務註冊成「shared」類型的服務,意味着這個服務將使用 [單例模式]運行, 一旦服務被首次解析後,這個實例將被保存在容器中,之後的每次請求都在容器中查找並返回這個實例
跟ThinkPHP一樣,也是放到了入口文件處
本節先到這裡,一點點慢慢深入發現其設計之美。
「
堅持學習、堅持寫作、堅持分享是咔咔從業以來所秉持的信念。願文章在偌大的互聯網上能給你帶來一點幫助,我是咔咔,下期見。
」