構建自己的PHP框架--定義ORM的接口


在上一篇博客中,我們抽象出了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文件夾下,這是我目前想到的最簡單的接口,可能會有所遺漏,我們會在開發的時候不斷完善。暫時我們會先按照這個實現。

這是一個接口,之后我們會有一個Model類實現這個接口,然后所有的Model都繼承這個Model類去實現。

 

好了,今天就先到這里。項目內容和博客內容也都會放到Github上,歡迎大家提建議。

code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.4

blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM