php 極簡框架ES發佈(代碼總和不到 400 行)

ES

框架簡介

ES 是一款 極簡,靈活, 高性能,擴建性強 的php 框架。 未開源以前在商業公司 經歷數年,數個高併發網站 實踐使用!php

框架結構

整個框架核心四個文件,全部文件加起來放在一塊兒總行數不超過400 行 html

|--src //受保護代碼文件夾
  |--lib
    |--es.php //啓動文件
    |--controller.php //控制器文件
    |--model.php //模型文件
    |--view.php //視圖引擎
  |--controller //控制器業務文件
  |--view //視圖文件
  |--model //模型通常小型業務能夠省略,數據操做直接放到controller 
  |--config.php //全局配置文件,業務相關的配置也能夠放這裏,或者本身創建一個獨立的配置文件index.php 文件引用
|--res //靜態資源
|--index.php //入口文件

具體實現功能

配置文件

配置路由規則

ES 沒有像些重型框架單獨有 Route 配置, ES的想法很簡單,主要分爲 模塊[m],控制器[c],動做[c] 來路由前端

'rewrite' => array(
        //設置模塊 碰到 http://{host}/admin/ 認爲進入了後臺模塊 數組 0 標識默認 m
       'm'=>['web','admin','app','api'], 
       'c'=>'main', //controller 默認值
       'a'=>'index', //action 默認值,
       'isRewrite'=> TRUE //是否開啓僞靜態 .htaccess 文件配置
    ),

其中 m 爲模塊,通常咱們開發小型web系統時候,後臺(admin)、前端(web)、接口(api) 來劃分結構; 大型一點的web系統,常根據業務進行模塊劃分,好比
shop、order、user 等等模塊劃分。 實際劃分就對應着 controller view 裏面的文件夾的安排,通常的 一個模塊對應其下面的一個文件夾,這樣清晰的管理模塊
方便協做開發和解耦mysql

另外 配置中 m=>[api..] 數組就是劃分的模塊,對應地址欄會去選擇 www.baidu.com/admin/con/index 域名部分後面的第一個 /admin/ 若是在配置中就表示爲識別到的模塊, 否者將模塊默認爲 m[0]
實現代碼能夠參考 es:git

$rewrite = $GLOBALS['rewrite'];
if ($rewrite['isRewrite']) {
    $route = explode("/", $_SERVER['PHP_SELF']);
    if (!empty($rule[1])) {
        if (in_array($rule[1], $rewrite['m'])) {
            $_GET['m'] = $route[1];
            list($_GET['c'], $_GET['a']) = array_slice($route, 2, 3);
        } else {
            $_GET['m'] = $rewrite['m'][0];
            list($_GET['c'], $_GET['a']) = array_slice($route, 1, 2);
        }
    }
}

數據庫配置

數據庫目前支持mysqlgithub

$dbb = array(
    'mysql' => [
        //主庫
        'master'=>[
            'MYSQL_HOST' => '127.0.0.1',
            'MYSQL_PORT' => '3306',
            'MYSQL_USER' => 'root',
            'MYSQL_DB' => 'db_demo',
            'MYSQL_PASS' => '123456',
            'MYSQL_CHARSET' => 'utf8',
        ],
        //從庫能夠加入多個實例
        'slave'=>[
            'MYSQL_HOST' => '127.0.0.1',
            'MYSQL_PORT' => '3306',
            'MYSQL_USER' => 'root',
            'MYSQL_DB' => 'db_demo',
            'MYSQL_PASS' => '123456',
            'MYSQL_CHARSET' => 'utf8',
        ]
    ],
    'prefix' => 'mo_',
);

業務自定義配置

自定義的業務方面的配置,能夠本身定義個配置文件,在config.php 進行引入,也能夠直接在config.php 進行修改配置,後面使用所有用web

$GLOBALS = require(APP_PATH . '../config.php');
$GLOBALS 全局 數組配置進行獲取相應的配置項。redis

控制器

Controller

控制器 (Get, Post , Head , Put http)+$_Get['a'] 的函數,直接暴露給了請求,請求能夠經過
$_GET['a'] 直接調用,若是麼沒有指定相應http 動做時間,直接調用 public action+$_GET['a'] 的函數
好比 客戶端get請求sql

/api/main/index
會路由到 controller/api/mainController.php 文件 下面 的 
public function getIndex(){} 函數,若是此函數不存在,會找個 
public function actionIndex(){} 函數

另外在寫http 接口時候咱們能夠直接 Restful api 格式用http 請求自動對應
好比shell

/api/good
會路由到 controller/api/goodController.php 文件 下面 的 
public function get(){} 函數
public function post(){} 函數
....已至restful Api接口寫法
//獲取視圖數據源的值
public function __get ($name)

//此函數設置的值能夠在視圖模板裏直接使用
public function __set ($name, $value)

//處理,好比修改 添加 數據成功時候須要返回列表頁, $msg 彈出的提示內容, $url 爲列表頁面的地址
public function success ($msg, $url)

//跟success 函數對應,直接返回上次操做頁面,好比添加保存成功 再調回到添加頁面
public function history ($msg)

//處理 action對應的模板 $tpl_name 模板地址 會自定到view 和controller 同名的文件夾
public function display ($tpl_name, $return = false)

basController

baseController 在每一個模塊裏面有父類,繼承系統核心Controller 主要用來處理

  • 處理模塊經常使用的業務(好比權限驗證)
  • 處理好比分頁的數據展示樣式
  • 公共的業務處理在默認狀況下沒有model 那麼把處理一些公共的數據操做業務也能夠放到這裏
  • 作數據輸出的過濾,好比同一個輸入格式 {"code":0,"message":""} 諸如此類函數的處理

數據模型

es 數據庫操做使用PDO pdo 自己對數據庫操做,參數化,防治sql諸如, 請在使用元素sql 語句查詢的時候,不要直接拼湊字符串。

讀寫分離(多數庫操做)

public function setDB($db_config_key = 'default', $is_readonly = false)

 $userDb = new Model('user');
 
//設置如下操做使用 sale0 實例
 $userDb->setDb('sale0', true);
 $user->...

查詢

//查詢user表數據
$userDb = new Model("user");

 /** 查詢數據返回數據數組集合
     * @param array 查詢條件能夠是數組,也能夠直接是字符串 好比 ['id'=>1] 等效 "and id = 1"
     * @param null 排序 如 " id desc"
     * @param string 查詢表字段
     * @param null $limit 這個參數比較關鍵,若是這個參數不爲空將 能夠分頁
     * @return mixed
     */
public function findAll ($conditions = array(), $sort = null, $fields = '*', $limit = null) 

//分頁查詢
$userData = $userDb->findAll('id> 1', 'id desc', '*', 10)

//執行爲上面的語句後
$userDb->page 返回一個分頁數組,模板裏面能夠根據這個數組去作必定處理
通常狀況BaseController 自定義個函數來拼湊html 顯示
或者直接 是先後端分離 json 直接打印給前端處理
 
//查詢單條數據
public function find ($conditions = array(), $sort = null, $fields = '*')

//sql 直接查詢
public function query($sql, $params = array())
$user = $userDb->query("select * from mo_user where id=? ", ['id'=>1]);

//查詢統計量等同於 sum($field) 返回直接返回整型
public function findSum($conditions, $field)

//查詢統計量等同於 count(1) 返回直接返回整型
public function findCount($conditions)

新增

/** 表插入記錄
 * @param $row
 * @return mixed
 */
public function create($row);

演示
$userDb = new Model('user');
$userDb->create(
    ['username'=>'es',
      'password'=>'123456',
      'sex'=>1
    ]
);

更新

/**
 * @param 查詢條件
 * @param 更加的數據
 * @return mixed
 */
public function update($conditions, $row)
$userDb->update(
    ['id'=>1],
    ['username'=>'es',
      'password'=>'123456',
      'sex'=>1
    ]
);

刪除

//按條件刪除數據
public function delete($conditions)

$userDb = new Model('user');
$userDb->delete(['id'=>1]);

視圖

es 採用php原始 腳本做爲模板標記語言, 主要好處有

  • 不須要額外學習一門新的標識語言
  • 速度上也是最快的
  • 實現起來簡單

模板引擎

php 原始腳本,只不過模板裏面可以使用的變量 只能來源controller __set 所設置的變量
保證模板使用的數據安全,按需所給。
  1. 母版

    引入母版機制(具體參考案例)
    html <?php include $_view_obj->compile($__template_file); ?>

擴展引用

es 自己最求靈活,極簡單,全部沒有引入其餘重型模板的功能點,好比cache, 連接redis 等等,那麼使用者,若是須要
相關功能怎麼辦能

步驟以下:

  • 配置擴展目錄
'plugins'=>['include','plugin'] //擴展目錄
  • 擴展目錄裏面放入擴展類[類文件直拷貝到目錄裏面]
class P
{
    public function test(){
        return '擴展';
    }
}
  • 在controller action 裏面
$p = new P();
$p->test()

支持常駐腳本

//能處理shell 請求
if (!empty($argc)) {
    $_POST['m'] = $argv[1];
    $_POST['c'] = $argv[2];
    $_POST['a'] = $argv[3];
}
$ php index.php m c a

案列

crm系統 https://github.com/Echosong/es_crm

聯繫方式

  • bug和建議請發送至:313690636@qq.com
  • 技術支持、技術合做或諮詢請聯繫做者QQ:313690636、微信:echosongfeigang
  • 博客地址 :http://www.cnblogs.com/echosong/

源碼託管

https://github.com/Echosong/ES

相關文章
相關標籤/搜索