本系列目錄

一、Phalcon在Windows上安裝 《Phalcon入坑指南系列 一》

二、Phalcon入坑必須知道的功能(專案配置、控制器、模型、增、刪、改、查)

三、Phalcon如何切換資料庫《Phalcon入坑指南系列 三》

複製標題直接搜尋即可

前言


咔咔閒談

在以前的專案中大多數都是一個庫就搞定了,很少遇到多庫操作的。

ThinkPHP框架對於多庫說的非常明白,但是這個Phalcon框架多庫就不是那麼容易了。

接下來看看Phalcon框架針對於跨庫如何操作。

一、解析Phalcon資料庫連線實現

之前學的東西不能忘,先使用命令來生成一個控制器phalcon create-controller --name 檔名


生成的控制器

接著使用命令列創建出一個模型檔案。


模型檔案

這個模型檔案裡邊的內容先不去管它,下文咔咔在慢慢的解釋哈!

根據config目錄下的配置可以得知!目前系統中使用的預設資料庫test


預設資料庫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類

註釋都寫的明明白白的,用起來就是先引入MySQL類,然後例項化即可。

二、設定切換資料庫連線

看了上文Phalcon對於預設資料庫的連線方式,那麼你有想法了嗎?

沒有想法的話,再給你簡化一下流程。

資料庫預設配置檔案config.php -> server.php讀取config的配置資訊 -> 通過類Phalcon\Db\Adapter\Pdo\Mysql來實現連線。

既然咱們要做,對應的點就是server.php


自己加的資料連線

根據上圖可以看到,所有的配置資訊都是直接寫進去的,並沒有從配置檔案中讀取。

今天要做的事情是多庫切換連線,為的是實現,優化工作後期做,並且也不會直接使用今天的這種方式來處理的。

然後回到建立的server模型中,進行設定此模型使用的資料庫名即可


設定連線的資料名

接著來到控制器中,先將version模型給例項化出來。

然後直接呼叫find方法,查詢id為1的資料。


實現

看一下列印結果


列印結果

再來對比一下跟資料庫的資料是否一一對應。


表資料

三、設定了多庫連線對預設連線的庫是否有影響

此時估計很多小夥伴會引發出這個問題,那麼不妨來進行測試一下。

可以切換到我們之前文章寫的index控制器

暫且就先看index這個方法


index方法

瀏覽器執行一下,看一下返回結果


檢視結果

不放心的話可以再看一下對應的資料庫對應的表資料


表資料

這下就可以放心了,到此本節主題多庫怎麼切換連線就說明完了。

四、疑問解答($di = new FactoryDefault())

在Phalcon中我們看到了使用了$di->setShared,對於這個di很多人都不明白其怎麼回事。

在這之前咔咔略微的對ThinkPHP的原始碼看了一遍,發現其功能就類似於ThinkPHP的容器概念。

在ThinkPHP中容器是使用了註冊樹模式,需要使用對應物件例項的時候就可以直接獲取,這樣就避免了一個類反覆的建立。這就是其中的一個優點。

通過對Phalcon原始碼的追蹤發現也是實現類似的功能,在容器中註冊一個服務。就跟ThinkPHP通過註冊樹設計模型來對註冊類進行儲存。

服務註冊成“shared”型別的服務,意味著這個服務將使用 [單例模式]執行, 一旦服務被首次解析後,這個例項將被儲存在容器中,之後的每次請求都在容器中查詢並返回這個例項


容器

跟ThinkPHP一樣,也是放到了入口檔案處


入口檔案

本節先到這裡,一點點慢慢深入發現其設計之美。

堅持學習、堅持寫作、堅持分享是咔咔從業以來所秉持的信念。願文章在偌大的網際網路上能給你帶來一點幫助,我是咔咔,下期見。