Phalcon如何切換數據庫《Phalcon入坑指南系列 三》

本系列目錄

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

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

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

複製標題直接搜索即可

前言

咔咔閑談
咔咔閑談

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

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

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

一、解析Phalcon數據庫連接實現

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

生成的控制器
生成的控制器

接着使用命令行創建出一個模型文件。

模型文件
模型文件

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

根據config目錄下的配置可以得知!目前系統中使用的默認數據庫test

默認數據庫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類

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

二、設置切換數據庫連接

看了上文Phalcon對於默認數據庫的連接方式,那麼你有想法了嗎?

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

數據庫默認配置文件config.php -> server.php讀取config的配置信息 -> 通過類Phalcon\Db\Adapter\Pdo\Mysql來實現連接。

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

自己加的數據連接
自己加的數據連接

根據上圖可以看到,所有的配置信息都是直接寫進去的,並沒有從配置文件中讀取。

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

然後回到創建的server模型中,進行設置此模型使用的數據庫名即可

設置連接的數據名
設置連接的數據名

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

然後直接調用find方法,查詢id為1的數據。

實現
實現

看一下打印結果

打印結果
打印結果

再來對比一下跟數據庫的數據是否一一對應。

表數據
表數據

三、設置了多庫連接對默認連接的庫是否有影響

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

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

暫且就先看index這個方法

index方法
index方法

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

查看結果
查看結果

不放心的話可以再看一下對應的數據庫對應的表數據

表數據
表數據

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

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

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

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

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

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

服務註冊成「shared」類型的服務,意味着這個服務將使用 [單例模式]運行, 一旦服務被首次解析後,這個實例將被保存在容器中,之後的每次請求都在容器中查找並返回這個實例

容器
容器

跟ThinkPHP一樣,也是放到了入口文件處

入口文件
入口文件

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

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

Tags: