框架的核心鏈路是從開始的請求路由解析到控制器的分發,model的數據交互到響應。
使用其餘的框架實現會很是的笨重,集成的內容太多,不少都不須要用到,因此借鑑其餘框架寫了一個簡單實用的框架。php
先從路由開始來講:
1)路由
路由協議的規則是使用了正則表達的匹配,將不一樣的連接分發到不一樣的控制器上去,也支持調用匿名函數git
// 第一種,使用匿名函數 App::router()->get('/', function () { echo "Beauty Framework."; });
// 第二種,使用url分發到控制器 App::router()->post('/user/info/[0-9]+(/[0-9]+)?', 'App\Controllers\UserController@getUserInfo');
其中實現的核心代碼:(是否是很簡單)github
if (is_string($lostrcallable) && preg_match('!^([\a-zA-Z0-9]+)\@([a-zA-Z0-9]+)$!', $lostrcallable, $matches)) { $class = $matches[1]; $method = $matches[2]; $callable = function () use ($class, $method) { static $obj = null; if ($obj === null) { $obj = new $class; } return call_user_func_array(array($obj, $method), func_get_args()); }; }
2)控制器
沒有的,你指向的哪裏,就能夠在哪裏進行請求處理,可是按照MVC,建議寫到Controller裏,你們都是這麼認爲的,就這麼作;redis
3)模型層
這裏直接集成了Dao類,用於數據庫查詢操做,由於如今不少都在使用MySQL,就耦合地實現了MySQL的常規操做,由於數據庫的原生操做會引發不少的注入等問題,沒有支持直接Qquery的方式來作。sql
4)DAO層
由於不少狀況下都要進行讀寫分離,可是要使用MySQL Proxy來實現,有太過笨重,因此實現了支持數據庫query根據不一樣的sql分別使用master和slave數據庫。
怎麼作的?數據庫
就是根據不用的查詢操做直接劃分,Select查詢操做直接分到讀庫,Insert、Update、Delete直接分到寫庫。也能夠直接使用onMasterConnection/onSlaveConnection直接指定.json
看看Select怎麼作的,這部分是實現邏輯:數組
/** * 獲取查詢內容,以數組形式返回,數據內爲array。 * * @access public * @param integer|array $limit Array to define SQL limit in format Array ($count, $offset) * or only $count * * @return mixed Array of Clients */ protected function get($limit = null) { $this->dbClient->setQueryChannel($this->channel); $results = $this->dbClient->arrayBuilder()->get($this->dbTable, $limit, $this->fields); $this->_reset(); if ($this->dbClient->count == 0) { return []; } return $results; }
5)配置類
在開發環境和生產環境會使用不一樣的配置環境,在框架中能夠建立.env環境來切換。在config中能夠常規設置development和production,使用哪一個環境就在.env設置哪一個app
; This is a environment configuration file environment=development
固然也有一些公共的配置信息,能夠在config文件裏直接設置,這樣就能夠在哪一個環境均可以使用。框架
// 支持使用.鏈接訪問配置項,訪問的是config/app.php中的config key \Beauty\Core\App::config()->get("app.config");
6)請求響應
由於不須要View,只須要返回json數據,因此在Header直接寫死了text/json。 = =
其餘實現了
具體代碼都在github上 https://github.com/tigerk/Beauty