一步步編寫PHP的Framework(十八)

來源:互聯網
上載者:User

 

上一次我們把模型的驅動類實現了,由於ConnectionManager需要按照設定檔中配置的驅動名執行個體化驅動類,所以我們先在設定檔中加入驅動名:

01 <?php
02 return array(
03     'defaultController' => 'Index',
04     'defaultAction' => 'index',
05     'debug' => true,
06     'errorReporting' => -1,
07     'timeZone' => 'PRC',
08     'db' => array(
09         'dsn' => 'mysql:dbname=test;host=localhost',
10         'user' => 'test',
11         'pwd' => 'test',
12         'driver' => 'pdo'
13     )
14 );

這裡面的db下面的driver就是驅動名。

 

設定檔弄好之後,ConnectionManager這個類的兩個靜態方法:getConnection和releaseConnection的實現就很簡單了,首先getConnection就是按照設定檔中的配置選擇一個驅動類,然後執行個體化,當然,由於以後模型檔案可能有多個,然後資料庫的串連最好只有一個,所以這個地方必須是單例的,releaseConnection就更簡單了,直接調用驅動類的close方法即可。

01 <?php
02 class ConnectionManager extends Base {
03     private static $_instance = null;
04     public static function getConnection() {
05         if(self::$_instance == null) {
06             //按照設定檔尋找驅動類,然後串連DB
07             switch(C('db=>driver')) {
08                 case 'pdo' :
09                     self::$_instance = new PdoDriver();
10                     break;
11                 default :
12                     self::$_instance = new PdoDriver();
13                     break;
14             }
15         }
16         return self::$_instance;
17     }
18     public static function releaseConnection() {
19         if(null !== self::$_instance) {
20             self::$_instance.close();
21         }
22     }
23 }

ConnectionManager寫完之後,我們再講ModelBase,由於這個類是後面的表模型和關聯式模式的父類,所以它基本上定義了外部可訪問的所有介面,如execute,select,update,insert,delete等。現在我們先寫一個比較簡單的ModelBase,這個例子中只有建構函式,execute,getAll三個方法,execute就是執行一個SQL,getAll就是擷取資料。

註:如果按照之前我們講的可以按照對象,普通數組或者Iterator返回資料,那麼此處的getAll就比較複雜了,但是現在我們在getAll中就直接調用getAllByAssocArray,這樣這個方法就非常簡單了。

好了,話不多說,直接貼代碼吧!!

01 <?php
02 class ModelBase extends Base {
03     protected $_db = null;
04     public function __construct() {
05         $this->_db = ConnectionManager::getConnection();
06     }
07     public function execute($sql,Array $arr) {
08         $this->_db->prepare($sql);
09         $this->_db->execute($arr);
10     }
11     public function getAll() {
12         return $this->_db->getAllByAssocArray();
13     }
14 }

 

由於此處沒有幾行代碼,所以就不講了,下面講一下複雜一點的東西了啊。。。

我之前在B這一塊兒還分了一個Sql Parse,它主要完成SQL的解析,我們知道一個簡單的查詢語句格式如下:

SELECT  [ALLDISTINCT]  Field FROM Table  WHERE whereCondition [GROUP BY groupCondition] [HAVING havingCondition] [ORDER BY orderCondition] 

之前我們都是直接寫一個SQL字串,這種方式不利於我們擴充,如果我們只需要指定SQL的一部分內容,其他的內容架構可以自動完成,這樣維護起來容易一些,當然,複雜的SQL我不建議這麼做。

就比如在表模型中,我們是指定了表名的,那麼架構應該可以識別出來Table這一塊兒,還有Field這部分可以預設為*,whereCondition如果沒有可以不寫,All或DISTINCT預設是ALL即可。

現在假設在一個表模型中,關聯的表為user,那麼執行一個$this->select(),按照原來的觀點系統根本不知道查詢的語句是什麼,自然也就無法執行了,但是如果架構可以自動完成SQL的話,這個SQL就變成了:

SELECT * FROM user

這樣一個SQL語句是沒有任何問題的。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。