在上一篇博客中,我們抽象出了Controller的基類,實現了頁面的渲染和返回JSON字符串的功能。
那作為一個框架,我們現在還缺少什麼?是的,大家應該已經注意到了,我們在這之前從來沒有連接過數據庫,我們缺少一個ORM(Object Relational Mapping)。
在php中連接mysql有三種方式,分別是使用原生函數、mysqli擴展和PDO擴展,詳細內容可以查看我之前的博客《PHP的學習--連接MySQL的三種方式》。
我們要選擇哪一種呢?考慮到作為一個框架不能僅支持一種數據庫,我們就選擇使用PDO。當然如果你確定你的框架只需要連接mysql數據庫,也可以考慮使用mysqli。
PDO支持如下的數據庫:
當然,這些數據庫即使都可以使用PDO去連接使用,但在某些具體的情況下,還是有些許不同的,詳情可參考PDO文檔
鑒於我電腦現在只安裝了mysql,之後的code,只會測試mysql數據庫,不會測試其他數據庫。
首先我們會將這些內容放在src/db文件夾中,我們需要定義一下接口,這裡我們會先安最簡單的來。
我們需要實現什麼?最簡單的就是數據的增刪改查。
假設我們現在有一張article表,一個與之對應的Model Article,我們希望怎麼用它呢?
// 選出id為1的一篇文章 $article = Article::findOne(['id' => 1]); // 選出status是unpublished的所有文章 $articles = Article::findAll(['status' => 'unpublished']); // 將id為1的所有文章的status更新為published Article::updateAll(['id' => 2], ['status' => 'published']); // 刪除所有id為1的文章 Article::deleteAll(['id' => 2]); // $article是之前選出的id為1的文章 // 更新它的屬性status為unpublished $article->status = 'unpublished'; // 保存更新到數據庫 $article->update(); // 刪除該文章 $article->delete(); // 創建一個新文章 $article = new Article(); $article->name = 'My first article'; $article->status = 'published'; // 將該文章保存到數據庫中 $article->insert();
大概在上面列了一下,我們簡單的ORM實現之後的使用,據此我們可以定義出如下接口:
<?php namespace sf\db; interface ModelInterface { public static function tableName(); public static function primaryKey(); public static function findOne($condition); public static function findAll($condition); public static function updateAll($condition, $attributes); public static function deleteAll($condition); public function insert(); public function update(); public function delete(); }
該文件放在src/db文件夾下,這是我目前想到的最簡單的接口,可能會有所遺漏,我們會在開發的時候不斷完善。暫時我們會先按照這個實現。
這是一個接口,之後我們會有一個BaseModel類實現這個接口,然後所有的Model都繼承BaseModel去實現。
好了,今天就先到這裡。項目內容和博客內容也都會放到Github上,歡迎大家提建議。
code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.4
blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework