精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從0開始構建一個屬于你自己的PHP框架

開發 后端
為什么我們要去構建一個自己的PHP框架?可能絕大多數的人都會說“市面上已經那么多的框架了,還造什么輪子?”。我的觀點“造輪子不是目的,造輪子的過程中汲取到知識才是目的”。

從0開始構建一個屬于你自己的PHP框架

英文版

如何構建一個自己的PHP框架

為什么我們要去構建一個自己的PHP框架?可能絕大多數的人都會說“市面上已經那么多的框架了,還造什么輪子?”。我的觀點“造輪子不是目的,造輪子的過程中汲取到知識才是目的”。

從0開始構建一個屬于你自己的PHP框架

那怎樣才能構建一個自己的PHP框架呢?大致流程如下:

  1. 入口文件 ----> 注冊自加載函數 
  2.         ----> 注冊錯誤(和異常)處理函數 
  3.         ----> 加載配置文件 
  4.         ----> 請求 
  5.         ----> 路由  
  6.         ---->(控制器 <----> 數據模型) 
  7.         ----> 響應 
  8.         ----> json 
  9.         ----> 視圖渲染數據 

除此之外我們還需要單元測試、nosql支持、接口文檔支持、一些輔助腳本等。最終我的框架目錄如下:

框架目錄一覽

  1. app                             [PHP應用目錄] 
  2. ├── demo                        [模塊目錄] 
  3. │   ├── controllers             [控制器目錄] 
  4. │   │      └── Index.php        [默認控制器文件,輸出json數據] 
  5. │   ├── logics                  [邏輯層,主要寫業務邏輯的地方] 
  6. │   │   ├── exceptions          [異常目錄] 
  7. │   │   ├── gateway            [一個邏輯層實現的gateway演示] 
  8. │   │   ├── tools               [工具類目錄] 
  9. │   │   └── UserDefinedCase.php [注冊框架加載到路由前的處理用例] 
  10. │   └── models                  [數據模型目錄] 
  11. │       └── TestTable.php       [演示模型文件,定義一一對應的數據模型] 
  12. ├── config                      [配置目錄] 
  13. │    ├── demo                   [模塊配置目錄] 
  14. │    │   ├── config.php         [模塊自定義配置] 
  15. │    │   └── route.php          [模塊自定義路由] 
  16. │    ├── common.php             [公共配置] 
  17. │    ├── database.php           [數據庫配置] 
  18. │    └── nosql.php              [nosql配置] 
  19. docs                            [接口文檔目錄] 
  20. ├── apib                        [Api Blueprint] 
  21. │    └── demo.apib              [接口文檔示例文件] 
  22. ├── swagger                     [swagger] 
  23. framework                       [Easy PHP核心框架目錄] 
  24. ├── exceptions                  [異常目錄] 
  25. │      ├── CoreHttpException.php[核心http異常] 
  26. ├── handles                     [框架運行時掛載處理機制類目錄] 
  27. │      ├── Handle.php           [處理機制接口] 
  28. │      ├── ErrorHandle.php      [錯誤處理機制類] 
  29. │      ├── ExceptionHandle.php  [未捕獲異常處理機制類] 
  30. │      ├── ConfigHandle.php     [配置文件處理機制類] 
  31. │      ├── NosqlHandle.php      [nosql處理機制類] 
  32. │      ├── LogHandle.php        [log機制類] 
  33. │      ├── UserDefinedHandle.php[用戶自定義處理機制類] 
  34. │      └── RouterHandle.php     [路由處理機制類] 
  35. ├── orm                         [對象關系模型] 
  36. │      ├── Interpreter.php      [sql解析器] 
  37. │      ├── DB.php               [數據庫操作類] 
  38. │      ├── Model.php            [數據模型基類] 
  39. │      └── db                   [數據庫類目錄] 
  40. │          └── Mysql.php        [mysql實體類] 
  41. ├── nosql                       [nosql類目錄] 
  42. │    ├── Memcahed.php           [Memcahed類文件] 
  43. │    ├── MongoDB.php            [MongoDB類文件] 
  44. │    └── Redis.php              [Redis類文件] 
  45. ├── App.php                     [框架類] 
  46. ├── Container.php               [服務容器] 
  47. ├── Helper.php                  [框架助手類] 
  48. ├── Load.php                    [自加載類] 
  49. ├── Request.php                 [請求類] 
  50. ├── Response.php                [響應類] 
  51. ├── run.php                     [框架應用啟用腳本] 
  52. frontend                        [前端源碼和資源目錄] 
  53. ├── src                         [資源目錄] 
  54. │    ├── components             [vue組件目錄] 
  55. │    ├── views                  [vue視圖目錄] 
  56. │    ├── images                 [圖片] 
  57. │    ├── ... 
  58. ├── app.js                      [根js] 
  59. ├── app.vue                     [根組件] 
  60. ├── index.template.html         [前端入口文件模板] 
  61. ├── store.js                    [vuex store文件] 
  62. public                          [公共資源目錄,暴露到萬維網] 
  63. ├── dist                        [前端build之后的資源目錄,build生成的目錄,不是發布分支忽略該目錄] 
  64. │    └── ... 
  65. ├── index.html                  [前端入口文件,build生成的文件,不是發布分支忽略該文件] 
  66. ├── index.php                   [后端入口文件] 
  67. runtime                         [臨時目錄] 
  68. ├── logs                        [日志目錄] 
  69. ├── build                       [php打包生成phar文件目錄] 
  70. tests                           [單元測試目錄] 
  71. ├── demo                        [模塊名稱] 
  72. │      └── DemoTest.php         [測試演示] 
  73. ├── TestCase.php                [測試用例] 
  74. vendor                          [composer目錄] 
  75. .git-hooks                      [git鉤子目錄] 
  76. ├── pre-commit                  [git pre-commitcommit鉤子示例文件] 
  77. ├── commit-msg                  [git commit-msg示例文件] 
  78. .babelrc                        [babel配置文件] 
  79. .env                            [環境變量文件] 
  80. .gitignore                      [git忽略文件配置] 
  81. build                           [php打包腳本] 
  82. cli                             [框架cli模式運行腳本] 
  83. LICENSE                         [lincese文件] 
  84. logo.png                        [框架logo圖片] 
  85. composer.json                   [composer配置文件] 
  86. composer.lock                   [composer lock文件] 
  87. package.json                    [前端依賴配置文件] 
  88. phpunit.xml                     [phpunit配置文件] 
  89. README-CN.md                    [中文版readme文件] 
  90. README.md                       [readme文件] 
  91. webpack.config.js               [webpack配置文件] 
  92. yarn.lock                       [yarn lock文件] 

框架模塊說明:

入口文件

定義一個統一的入口文件,對外提供統一的訪問文件。對外隱藏了內部的復雜性,類似企業服務總線的思想。

  1. // 載入框架運行文件  
  2. require('../framework/run.php'); 

[ file: public/index.php ]

自加載模塊

使用spl_autoload_register函數注冊自加載函數到__autoload隊列中,配合使用命名空間,當使用一個類的時候可以自動載入(require)類文件。注冊完成自加載邏輯后,我們就可以使用use和配合命名空間申明對某個類文件的依賴。

[ file: framework/Load.php ]

錯誤和異常模塊

腳本運行期間:

  • 錯誤:

通過函數set_error_handler注冊用戶自定義錯誤處理方法,但是set_error_handler不能處理以下級別錯誤,E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 調用 set_error_handler() 函數所在文件中產生的大多數 E_STRICT。所以我們需要使用register_shutdown_function配合error_get_last獲取腳本終止執行的***錯誤,目的是對于不同錯誤級別和致命錯誤進行自定義處理,例如返回友好的提示的錯誤信息。

[ file: framework/hanles/ErrorHandle.php ]

異常:

通過函數set_exception_handler注冊未捕獲異常處理方法,目的捕獲未捕獲的異常,例如返回友好的提示和異常信息。

[ file: framework/hanles/ExceptionHandle.php ]

配置文件模塊

加載框架自定義和用戶自定義的配置文件。

[ file: framework/hanles/ConfigHandle.php ]

輸入和輸出

  • 定義請求對象:包含所有的請求信息
  • 定義響應對象:申明響應相關信息

框架中所有的異常輸出和控制器輸出都是json格式,因為我認為在前后端完全分離的今天,這是很友善的,目前我們不需要再去考慮別的東西。

[ file: framework/Request.php ]

[ file: framework/Response.php ]

路由模塊

通過用戶訪問的url信息,通過路由規則執行目標控制器類的的成員方法。我在這里把路由大致分成了四類:

傳統路由

  1. domain/index.php?module=Demo&contoller=Index&action=test&username=test 

pathinfo路由

  1. domain/demo/index/modelExample 

用戶自定義路由

  1. // 定義在config/moduleName/route.php文件中,這個的this指向RouterHandle實例 
  2. $this->get('v1/user/info'function (Framework\App $app) { 
  3.     return 'Hello Get Router'
  4. }); 

微單體路由

我在這里詳細說下這里所謂的微單體路由,面向SOA和微服務架構大行其道的今天,有很多的團隊都在向服務化邁進,但是服務化過程中很多問題的復雜度都是指數級的增長,例如分布式的事務,服務部署,跨服務問題追蹤等等。這導致對于小的團隊從單體架構走向服務架構難免困難重重,所以有人提出來了微單體架構,按照我的理解就是在一個單體架構的SOA過程,我們把微服務中的的各個服務還是以模塊的方式放在同一個單體中,比如:

  1. app 
  2. ├── UserService     [用戶服務模塊] 
  3. ├── ContentService  [內容服務模塊] 
  4. ├── OrderService    [訂單服務模塊] 
  5. ├── CartService     [購物車服務模塊] 
  6. ├── PayService      [支付服務模塊] 
  7. ├── GoodsService    [商品服務模塊] 
  8. └── CustomService   [客服服務模塊] 

如上,我們簡單的在一個單體里構建了各個服務模塊,但是這些模塊怎么通信呢?如下:

  1. App::$app->get('demo/index/hello', [ 
  2.     'user' => 'TIGERB' 
  3. ]); 

通過上面的方式我們就可以松耦合的方式進行單體下各個模塊的通信和依賴了。與此同時,業務的發展是難以預估的,未來當我們向SOA的架構遷移時,很簡單,我們只需要把以往的模塊獨立成各個項目,然后把App實例get方法的實現轉變為RPC或者REST的策略即可,我們可以通過配置文件去調整對應的策略或者把自己的,第三方的實現注冊進去即可。

[ file: framework/hanles/RouterHandle.php ]

傳統的MVC模式提倡為MCL模式

傳統的MVC模式包含model-view-controller層,絕大多時候我們會把業務邏輯寫到controller層或model層,但是慢慢的我們會發現代碼難以閱讀、維護、擴展,所以我在這里強制增加了一個logics層。至于,邏輯層里怎么寫代碼怎么,完全由你自己定義,你可以在里面實現一個工具類,你也可以在里面再新建子文件夾并在里面構建你的業務邏輯代碼,你甚至可以實現一個基于責任連模式的網關(我會提供具體的示例)。這樣看來,我們的最終結構是這樣的:

  • M: models, 職責只涉及數據模型相關操作
  • C: controllers, 職責對外暴露資源,前后端分離架構下controllers其實就相當于json格式的視圖
  • L: logics, 職責靈活實現所有業務邏輯的地方

logics邏輯層

邏輯層實現網關示例:

我們在logics層目錄下增加了一個gateway目錄,然后我們就可以靈活的在這個目錄下編寫邏輯了。gateway的結構如下:

  1. gateway                     [Logics層目錄下gateway邏輯目錄] 
  2.   ├── Check.php             [接口] 
  3.   ├── CheckAppkey.php       [檢驗app key
  4.   ├── CheckArguments.php    [校驗必傳參數] 
  5.   ├── CheckAuthority.php    [校驗訪問權限] 
  6.   ├── CheckFrequent.php     [校驗訪問頻率] 
  7.   ├── CheckRouter.php       [網關路由] 
  8.   ├── CheckSign.php         [校驗簽名] 
  9.   └── Entrance.php          [網關入口文件] 

網關入口類主要負責網關的初始化,代碼如下:

  1. // 初始化一個:必傳參數校驗的check 
  2. $checkArguments   =  new CheckArguments(); 
  3. // 初始化一個:app key check 
  4. $checkAppkey      =  new CheckAppkey(); 
  5. // 初始化一個:訪問頻次校驗的check 
  6. $checkFrequent    =  new CheckFrequent(); 
  7. // 初始化一個:簽名校驗的check 
  8. $checkSign        =  new CheckSign(); 
  9. // 初始化一個:訪問權限校驗的check 
  10. $checkAuthority   =  new CheckAuthority(); 
  11. // 初始化一個:網關路由規則 
  12. $checkRouter      =  new CheckRouter(); 
  13.  
  14. // 構成對象鏈 
  15. $checkArguments->setNext($checkAppkey) 
  16.                ->setNext($checkFrequent) 
  17.                ->setNext($checkSign) 
  18.                ->setNext($checkAuthority) 
  19.                ->setNext($checkRouter); 
  20.  
  21. // 啟動網關 
  22. $checkArguments->start( 
  23.     APP::$container->getSingle('request'
  24. ); 

實現完成這個gateway之后,我們如何在框架中去使用呢?在logic層目錄中我提供了一個user-defined的實體類,我們把gateway的入口類注冊到UserDefinedCase這個類中,示例如下:

  1. /** 
  2.  * 注冊用戶自定義執行的類 
  3.  * 
  4.  * @var array 
  5.  */ 
  6. private $map = [ 
  7.     // 演示 加載自定義網關 
  8.     'App\Demo\Logics\Gateway\Entrance' 
  9. ]; 

這樣這個gateway就可以工作了。接著說說這個UserDefinedCase類,UserDefinedCase會在框架加載到路由機制之前被執行,這樣我們就可以靈活的實現一些自定義的處理了。這個gateway只是個演示,你完全可以天馬行空的組織你的邏輯~

視圖View去哪了?由于選擇了完全的前后端分離和SPA(單頁應用), 所以傳統的視圖層也因此去掉了,詳細的介紹看下面。

[ file: app/* ]

使用Vue作為視圖

源碼目錄

完全的前后端分離,數據雙向綁定,模塊化等等的大勢所趨。這里我把我自己開源的vue前端項目結構 easy-vue 移植到了這個項目里,作為視圖層。我們把前端的源碼文件都放在frontend目錄里,詳細如下,你也可以自己定義:

  1. frontend                        [前端源碼和資源目錄,這里存放我們整個前端的源碼文件] 
  2. ├── src                         [資源目錄] 
  3. │    ├── components             [編寫我們的前端組件] 
  4. │    ├── views                  [組裝我們的視圖] 
  5. │    ├── images                 [圖片] 
  6. │    ├── ... 
  7. ├── app.js                      [根js] 
  8. ├── app.vue                     [根組件] 
  9. ├── index.template.html         [前端入口文件模板] 
  10. └── store.js                    [狀態管理,這里只是個演示,你可以很靈活的編寫文件和目錄] 

build步驟

  1. yarn install  
  2. DOMAIN=http://你的域名 npm run dev 

編譯后

build成功之后會生成dist目錄和入口文件index.html在public目錄中。非發布分支.gitignore文件會忽略這些文件,發布分支去除忽略即可。

  1. public [公共資源目錄,暴露到萬維網]  
  2. ├── dist [前端build之后的資源目錄,build生成的目錄,不是發布分支忽略該目錄] 
  3. │ └── ...  
  4. ├── index.html [前端入口文件,build生成的文件,不是發布分支忽略該文件] 

[ file: frontend/* ]

數據庫對象關系映射

數據庫對象關系映射ORM(Object Relation Map)是什么?按照我目前的理解:顧名思義是建立對象和抽象事物的關聯關系,在數據庫建模中model實體類其實就是具體的表,對表的操作其實就是對model實例的操作。可能絕大多數的人都要問“為什么要這樣做,直接sql語句操作不好嗎?搞得這么麻煩!”,我的答案:直接sql語句當然可以,一切都是靈活的,但是從一個項目的 可復用,可維護, 可擴展 出發,采用ORM思想處理數據操作是理所當然的,想想如果若干一段時間你看見代碼里大段的難以閱讀且無從復用的sql語句,你是什么樣的心情。

市面上對于ORM的具體實現有thinkphp系列框架的Active Record,yii系列框架的Active Record,laravel系列框架的Eloquent(據說是***雅的),那我們這里言簡意賅就叫ORM了。接著為ORM建模,首先是ORM客戶端實體DB:通過配置文件初始化不同的db策略,并封裝了操作數據庫的所有行為,最終我們通過DB實體就可以直接操作數據庫了,這里的db策略目前我只實現了mysql(負責建立連接和db的底層操作)。接著我們把DB實體的sql解析功能獨立成一個可復用的sql解析器的trait,具體作用:把對象的鏈式操作解析成具體的sql語句。***,建立我們的模型基類model,model直接繼承DB即可。***的結構如下:

  1. ├── orm                         [對象關系模型] 
  2. │      ├── Interpreter.php      [sql解析器] 
  3. │      ├── DB.php               [數據庫操作類] 
  4. │      ├── Model.php            [數據模型基類] 
  5. │      └── db                   [數據庫類目錄] 
  6. │          └── Mysql.php        [mysql實體類] 

DB類使用示例

  1. /** 
  2.  * DB操作示例 
  3.  * 
  4.  * findAll 
  5.  * 
  6.  * @return void 
  7.  */ 
  8. public function dbFindAllDemo() 
  9.     $where = [ 
  10.         'id'   => ['>=', 2], 
  11.     ]; 
  12.     $instance = DB::table('user'); 
  13.     $res      = $instance->where($where
  14.                          ->orderBy('id asc'
  15.                          ->limit(5) 
  16.                          ->findAll(['id','create_at']); 
  17.     $sql      = $instance->sql; 
  18.  
  19.     return $res; 

Model類使用示例

  1. // controller 代碼 
  2. /** 
  3.  * model example 
  4.  * 
  5.  * @return mixed 
  6.  */ 
  7. public function modelExample() 
  8.     try {  
  9.         DB::beginTransaction(); 
  10.         $testTableModel = new TestTable(); 
  11.  
  12.         // find one data 
  13.         $testTableModel->modelFindOneDemo(); 
  14.         // find all data 
  15.         $testTableModel->modelFindAllDemo(); 
  16.         // save data 
  17.         $testTableModel->modelSaveDemo(); 
  18.         // delete data 
  19.         $testTableModel->modelDeleteDemo(); 
  20.         // update data 
  21.         $testTableModel->modelUpdateDemo([ 
  22.                'nickname' => 'easy-php' 
  23.             ]); 
  24.         // count data 
  25.         $testTableModel->modelCountDemo(); 
  26.  
  27.         DB::commit(); 
  28.         return 'success'
  29.  
  30.     } catch (Exception $e) { 
  31.         DB::rollBack(); 
  32.         return 'fail'
  33.     } 
  34.  
  35. //TestTable model 
  36. /** 
  37.  * Model操作示例 
  38.  * 
  39.  * findAll 
  40.  * 
  41.  * @return void 
  42.  */ 
  43. public function modelFindAllDemo() 
  44.     $where = [ 
  45.         'id'   => ['>=', 2], 
  46.     ]; 
  47.     $res = $this->where($where
  48.                 ->orderBy('id asc'
  49.                 ->limit(5) 
  50.                 ->findAll(['id','create_at']); 
  51.     $sql = $this->sql; 
  52.  
  53.     return $res; 

[ file: framework/orm/* ]

服務容器模塊

什么是服務容器?

服務容器聽起來很浮,按我的理解簡單來說就是提供一個第三方的實體,我們把業務邏輯需要使用的類或實例注入到這個第三方實體類中,當需要獲取類的實例時我們直接通過這個第三方實體類獲取。

服務容器的意義?

用設計模式來講:其實不管設計模式還是實際編程的經驗中,我們都是強調“高內聚,松耦合”,我們做到高內聚的結果就是每個實體的作用都是極度專一,所以就產生了各個作用不同的實體類。在組織一個邏輯功能時,這些細化的實體之間就會不同程度的產生依賴關系,對于這些依賴我們通常的做法如下:

  1. class Demo 
  2.     public function __construct() 
  3.     { 
  4.         // 類demo直接依賴RelyClassName 
  5.         $instance = new RelyClassName(); 
  6.     } 

這樣的寫法沒有什么邏輯上的問題,但是不符合設計模式的“最少知道原則”,因為之間產生了直接依賴,整個代碼結構不夠靈活是緊耦合的。所以我們就提供了一個第三方的實體,把直接依賴轉變為依賴于第三方,我們獲取依賴的實例直接通過第三方去完成以達到松耦合的目的,這里這個第三方充當的角色就類似系統架構中的“中間件”,都是協調依賴關系和去耦合的角色。***,這里的第三方就是所謂的服務容器。

在實現了一個服務容器之后,我把Request,Config等實例都以單例的方式注入到了服務容器中,當我們需要使用的時候從容器中獲取即可,十分方便。使用如下:

  1. // 注入單例 
  2. App::$container->setSingle('別名,方便獲取''對象/閉包/類名'); 
  3.  
  4. // 例,注入Request實例 
  5. App::$container->setSingle('request'function () { 
  6.     // 匿名函數懶加載 
  7.     return new Request(); 
  8. }); 
  9. // 獲取Request對象 
  10. App::$container->getSingle('request'); 

[ file: framework/Container ]

Nosql模塊

提供對nosql的支持,提供全局單例對象,借助我們的服務容器我們在框架啟動的時候,通過配置文件的配置把需要的nosql實例注入到服務容器中。目前我們支持redis/memcahed/mongodb。

如何使用?如下,

  1. // 獲取redis對象 
  2. App::$container->getSingle('redis'); 
  3. // 獲取memcahed對象 
  4. App::$container->getSingle('memcahed'); 
  5. // 獲取mongodb對象 
  6. App::$container->getSingle('mongodb'); 

[ file: framework/nosql/* ]

接口文檔生成和接口模擬模塊

通常我們寫完一個接口后,接口文檔是一個問題,我們這里使用Api Blueprint協議完成對接口文檔的書寫和mock(可用),同時我們配合使用Swagger通過接口文檔實現對接口的實時訪問(目前未實現)。

Api Blueprint接口描述協議選取的工具是snowboard,具體使用說明如下:

接口文檔生成說明

  1. cd docs/apib  
  2. ./snowboard html -i demo.apib -o demo.html -s  
  3. open the website, http://localhost:8088/ 

接口mock使用說明

  1. cd docs/apib  
  2. ./snowboard mock -i demo.apib  
  3. open the website, http://localhost:8087/demo/index/hello 

[ file: docs/* ]

單元測試模塊

基于phpunit的單元測試,寫單元測試是個好的習慣。

如何使用?

tests目錄下編寫測試文件,具體參考tests/demo目錄下的DemoTest文件,然后運行:

  1. vendor/bin/phpunit 

測試斷言示例:

  1. /** 
  2.  * 演示測試 
  3.  */ 
  4. public function testDemo() 
  5.     $this->assertEquals( 
  6.         'Hello Easy PHP'
  7.         // 執行demo模塊index控制器hello操作,斷言結果是不是等于'Hello Easy PHP'  
  8.         App::$app->get('demo/index/hello'
  9.     ); 

phpunit斷言文檔語法參考

[ file: tests/* ]

Git鉤子配置

目的規范化我們的項目代碼和commit記錄。

  • 代碼規范:配合使用php_codesniffer,在代碼提交前對代碼的編碼格式進行強制驗證。
  • commit-msg規范:采用ruanyifeng的commit msg規范,對commit msg進行格式驗證,增強git log可讀性和便于后期查錯和統計log等, 這里使用了 Treri 的commit-msg腳本,Thx~。

[ file: ./git-hooks/* ]

輔助腳本

cli腳本

以命令行的方式運行框架,具體見使用說明。

build腳本

打包PHP項目腳本,打包整個項目到runtime/build目錄,例如:

  1. runtime/build/App.20170505085503.phar  
  2. <?php 
  3. // 入口文件引入包文件即可 
  4. require('runtime/build/App.20170505085503.phar'

[ file: ./build ]

如何使用?

執行:

  • composer install
  • chmod -R 777 runtime

網站服務模式:

  • 步驟 1: yarn install
  • 步驟 2: DOMAIN=http://localhost:666 npm run demo
  • 步驟 3: cd public
  • 步驟 4: php -S localhost:666

訪問網站:http://localhost:666/index.html

訪問接口:http://localhost:666/Demo/Index/hello

demo如下:

客戶端腳本模式:

  1. php cli --method= --= ...  
  2. 例如, php cli --method=demo.index.get --username=easy-php 

獲取幫助:

使用命令 php cli 或者 php cli --help

問題和貢獻

不足的地方還有很多,如果大家發現了什么問題,可以給我提 issue 或者PR。

或者你覺著在這個框架實現的細節你想了解的,一樣可以給我提 issue ,后面我會總結成相應的文章分享給大家。

如何貢獻?

  1. cp ./.git-hooks/* ./git/hooks 

然后正常發起PR即可, 所有的commit我都會進行代碼格式(psr)驗證和commit-msg驗證,如果發生錯誤,請按照提示糾正即可。

項目地址: https://github.com/TIGERB/easy-php

TODO

  • 懶加載優化框架加載流程
  • 性能測試和優化
  • 變更Helper助手類的成員方法為框架函數,簡化使用提高生產效率
  • 提供更友善的開發api幫助
  • 模塊支持數據庫nosql自定義配置
  • 支持mysql主從配置
  • ORM提供更多鏈式操作api
  • 框架log行為進行級別分類
  • 想辦法解決上線部署是配置文件問題
  • 基于phar文件和git webhook自動化打包部署
  • ...
責任編輯:未麗燕 來源: Github
相關推薦

2022-09-01 10:46:02

前端組件庫

2020-04-07 15:12:07

微服務架構數據

2018-08-15 10:51:01

JavaSpring MVC框架

2016-09-14 17:48:44

2013-01-14 09:44:58

JavaScriptJSJS框架

2015-09-06 10:58:36

PHP框架搭建結構

2020-04-02 08:47:04

開發網站技術

2024-02-06 09:55:33

框架代碼

2020-01-09 11:11:35

RPC框架調用遠程

2012-06-04 18:02:56

社區

2019-05-13 15:05:34

TomcatWeb Server協議

2014-08-26 10:05:37

框架開發AngularJS

2009-10-01 09:19:45

PHP框架ZendFramewoCake

2015-07-03 11:27:30

程序員自己神器

2021-08-04 11:55:45

Python天氣查詢PySide2

2024-06-07 09:13:23

2022-07-06 19:00:00

微服務框架鏈路

2024-09-14 14:09:40

2013-07-10 10:38:48

JavaScript框

2021-03-10 09:52:38

開發技能架構
點贊
收藏

51CTO技術棧公眾號

免费一级特黄毛片| 午夜精品久久久久久久男人的天堂 | 色一情一乱一乱一91av| 免费成人深夜夜行视频| 婷婷激情五月网| 青青草91久久久久久久久| caoporn国产一区二区| 97成人超碰免| 一起操在线视频| 国产成人高清精品| 嫩草国产精品入口| 91国偷自产一区二区三区观看 | 亚洲福中文字幕伊人影院| 国产精品三区在线| 五月婷六月丁香| 欧洲亚洲精品久久久久| 亚洲毛片av在线| 97国产一区二区精品久久呦| 欧美黄色激情视频| 成人国产精品一区二区网站| 精品欧美一区二区三区| 2025韩国大尺度电影| 四虎精品在线| 精品一区二区三区免费| 91国在线精品国内播放| 纪美影视在线观看电视版使用方法| 国产精品日本一区二区不卡视频| 精品日本高清在线播放| 在线免费观看成人| 久久精品a一级国产免视看成人 | 午夜视频在线观看一区二区| 日韩精品欧美一区二区三区| 免费看av毛片| 激情成人综合网| 国产精品va在线| 日韩av电影网| 国内精品久久久久久久97牛牛| 国产亚洲欧美日韩美女| 中文字幕a在线观看| 向日葵视频成人app网址| 一区二区高清在线| 国产美女精品免费电影| www欧美在线| 亚洲免费黄色| 欧美激情亚洲自拍| 国产精品白嫩白嫩大学美女| 日韩电影免费在线观看| 亚洲人成电影网站| 人妻大战黑人白浆狂泄| 免费观看在线一区二区三区| 欧美中文字幕一区二区三区| 无码人妻h动漫| 91福利区在线观看| 成人午夜在线播放| 成人h视频在线观看播放| 成人黄色片在线观看| 午夜在线精品偷拍| 欧美国产日本在线| 国产一级在线播放| 91超碰国产精品| 久久成人在线视频| 自拍偷拍第9页| 成人精品久久| 亚洲欧洲xxxx| 免费的av网站| 国模私拍一区二区国模曼安| 亚洲一区二区三区四区的| 欧美 国产 精品| 18加网站在线| 亚洲国产欧美日韩另类综合| 日韩精品久久一区二区| 丝袜美女在线观看| 99久久er热在这里只有精品66| 丁香婷婷久久久综合精品国产| 精品人妻一区二区三区含羞草| 国产酒店精品激情| 国产精品久久九九| 五月天丁香视频| 久久久久久久久久久99999| 欧美激情导航| 精品视频三区| 国产精品高清亚洲| 日本天堂免费a| caoprom在线| 色国产精品一区在线观看| 农村妇女精品一二区| 国产精选在线| 在线这里只有精品| 国产九九在线视频| 成人黄色网址| 亚洲一区二区成人在线观看| 久色视频在线播放| 蜜桃成人精品| 91精品国产综合久久蜜臀| 国产精品日日摸夜夜爽| 精品一区欧美| 久久福利网址导航| 国产精品久久无码| 日韩啪啪电影网| 久久免费成人精品视频| 无码aⅴ精品一区二区三区| 久久精品72免费观看| 超碰97人人人人人蜜桃| 影音先锋国产资源| 国产·精品毛片| 日韩精品久久一区二区三区| 污污网站在线观看| 欧美亚洲国产怡红院影院| www.av毛片| 日韩精品一区二区三区av| 在线综合视频播放| 国产伦精品一区二区三区妓女 | 资源网第一页久久久| 爱啪啪综合导航| 欧美丰满嫩嫩电影| 欧美亚洲日本在线观看| 精品视频一区二区三区在线观看| 欧美一区二区视频观看视频| 亚洲精品视频大全| 五月开心六月丁香综合色啪 | 成人免费视频观看| 日韩经典中文字幕| 精品97人妻无码中文永久在线| 视频一区视频二区中文字幕| 97超级碰碰| 在线视频1卡二卡三卡| 国产99精品国产| 在线观看亚洲视频啊啊啊啊| 蜜桃麻豆影像在线观看| 久久综合狠狠综合久久激情| 日韩人妻一区二区三区蜜桃视频| 欧美性理论片在线观看片免费 | 国产a级免费视频| 久久精子c满五个校花| 亚洲色成人www永久在线观看| 国产精品久久久久77777丨| 亚洲精品不卡在线| 国产亚洲欧美精品久久久www| 精品无人码麻豆乱码1区2区 | 一本一道久久综合狠狠老| 日本亚洲欧洲色α| 亚洲欧洲精品视频| 五月天精品一区二区三区| 女王人厕视频2ⅴk| 羞羞答答成人影院www| 国产精品视频一区国模私拍| 欧美大片aaa| 欧美日韩一二三四五区| 国产毛片毛片毛片毛片毛片毛片| 激情久久一区| 91系列在线观看| av大片在线免费观看| 国产在线精品视频| 美女黄色片网站| 在线日本欧美| 国产一区二区三区在线视频| 国产精品自拍99| 26uuu另类欧美亚洲曰本| 欧美这里只有精品| 99久热这里只有精品视频免费观看| 精品综合久久久久久97| www.亚洲天堂.com| 亚洲高清视频中文字幕| 真人bbbbbbbbb毛片| 亚洲影院免费| 日本在线观看一区二区三区| 国产极品久久久久久久久波多结野| 日韩久久免费电影| 在线观看免费av片| 国产视频911| 欧美两根一起进3p做受视频| 波多野结衣在线观看一区二区 | 久久国产视频一区| 蜜桃伊人久久| 天天久久人人| 91成人精品观看| 另类视频在线观看| 后入内射欧美99二区视频| 天天免费综合色| 亚洲一区二区自偷自拍| 九九视频精品免费| 精品人妻大屁股白浆无码| 嗯用力啊快一点好舒服小柔久久| 78色国产精品| 成在在线免费视频| 日韩欧美国产高清91| 萌白酱视频在线| 丁香婷婷深情五月亚洲| 美女av免费在线观看| 日本久久综合| 国产精品裸体一区二区三区| 在线观看欧美日韩电影| 国产亚洲aⅴaaaaaa毛片| 国产毛片在线视频| 欧美日韩国产精品| 国产精品国产三级国产传播| 母乳一区在线观看| 色视频一区二区三区| 中文在线综合| 午夜精品一区二区三区在线播放| www.亚洲.com| 精品国产91久久久久久久妲己 | 国产美女喷水视频| 韩国毛片一区二区三区| 欧美亚洲另类色图| 久久国产电影| 国产主播一区二区三区四区| 搞黄网站在线观看| 日韩国产高清污视频在线观看| 亚洲天堂网在线视频| 午夜一区二区三区在线观看| 国产视频三区四区| gogo大胆日本视频一区| 国产永久免费网站| 玖玖玖国产精品| 欧美性潮喷xxxxx免费视频看| 国内成人精品| 久久精品99久久| 亚洲日本视频在线| 国产91免费看片| 国产后进白嫩翘臀在线观看视频 | 国产激情美女久久久久久吹潮| 成人精品动漫| 热久久99这里有精品| 伦xxxx在线| 国产亚洲欧洲在线| 天堂av手机版| 日韩欧美一区电影| 日本视频在线免费| 91麻豆福利精品推荐| 亚洲精品久久久久久| 久久国产婷婷国产香蕉| 91动漫在线看| 亚洲一级一区| 野外做受又硬又粗又大视频√| 小说区亚洲自拍另类图片专区 | 欧美日本一区二区高清播放视频| 亚洲国产精品久久久久久女王| 欧亚精品一区| 精品无码久久久久国产| 大香伊人久久精品一区二区| 国产综合久久久久久| 成人国产激情在线| 国产精品美女www| 成人做爰视频www| 奇米影视亚洲狠狠色| 鲁鲁在线中文| 91精品国产高清久久久久久| 91黄色在线| 色综合亚洲精品激情狠狠| 五月天激情婷婷| 欧美精品一区二区三区四区 | 你懂得影院夜精品a| 日韩av免费看| 91精品国产66| 成人免费淫片aa视频免费| 日本一区二区三区中文字幕| 国产精品视频中文字幕91| 日韩欧美专区| 91亚洲精华国产精华| 久久久精品区| 国产高清一区视频| 曰本一区二区三区视频| 日韩国产伦理| 久久视频精品| 超碰97在线看| 亚洲毛片在线| 成人免费aaa| 久久九九国产| 北条麻妃视频在线| 久久精品国产精品青草| 911福利视频| 国产999精品久久久久久绿帽| 好吊色视频一区二区三区| 久久女同性恋中文字幕| av网页在线观看| 久久精品免视看| 亚洲激情 欧美| 欧美国产禁国产网站cc| 久久嫩草捆绑紧缚| 亚洲成人777| 国产成人无码av| 51精品秘密在线观看| www.国产黄色| 亚洲视频欧洲视频| 麻豆影视国产在线观看| 久久久久国产精品免费网站| 国产精品扒开腿做爽爽爽视频软件| 国产色视频一区| 哺乳挤奶一区二区三区免费看| 就去色蜜桃综合| 日韩国产综合| 神马一区二区影院| 狠狠爱www人成狠狠爱综合网| 国产aaa一级片| 国产一区二区三区免费观看| 亚洲欧美视频在线播放| 国产精品久久久久久久岛一牛影视 | 亚洲一区二区免费在线观看| 欧美韩国日本精品一区二区三区| 久久精品青草| 国产女女做受ⅹxx高潮| 精品一区二区三区香蕉蜜桃 | 国产丝袜美腿一区二区三区| 欧美成人三级视频| 欧美影院精品一区| 色欲av永久无码精品无码蜜桃| 日韩精品欧美激情| 黄色在线视频观看网站| 欧美激情一区二区久久久| 精品久久在线| 蜜桃臀一区二区三区| 欧美精品国产一区| 日韩大片一区二区| aaa亚洲精品一二三区| 人人艹在线视频| 欧美视频13p| 蜜桃91麻豆精品一二三区| 丝袜亚洲另类欧美重口| 精品国产免费人成网站| 国产精品自拍首页| 亚洲精品a级片| 在线免费观看视频黄| 99久久伊人网影院| 日韩黄色免费观看| 色综合亚洲欧洲| 免费观看国产精品| 在线视频日韩精品| jizz内谢中国亚洲jizz| 国产乱子伦精品| 黄色成人精品网站| 嫩草影院国产精品| 久久亚洲免费视频| 久久久久久久久久网站| 欧美高清性hdvideosex| 国产福利在线看| 国产成人精品av在线| 蜜臀av免费一区二区三区| 欧美日韩性生活片| 99精品在线观看视频| 国产对白videos麻豆高潮| 欧美v日韩v国产v| 欧美日韩在线视频免费观看| 91精品国产综合久久久久久丝袜| 欧美精品一二| av色综合网| 欧美一区二区| 高清av免费看| 国产sm精品调教视频网站| 91麻豆免费视频网站| 欧美三级电影网| 日韩一区二区三区不卡| 欧美大片在线看| 成人性生交大片免费看中文视频| 欧美另类videosbestsex日本| 久久精品毛片| 无码人妻丰满熟妇啪啪欧美| 欧美综合一区二区三区| 成年人在线观看| 国产色视频一区| 欧美1区2区| 蜜臀视频在线观看| 亚洲妇女屁股眼交7| 欧美美女搞黄| 国产精品女人网站| 国产精品久久久久久麻豆一区软件 | 国产免费高清一区| 国产精品一国产精品k频道56| 日韩国产欧美亚洲| 91在线播放网址| 懂色av中文字幕| 精品国产美女在线| 色老太综合网| 一区二区三区国| 激情久久久久久久久久久久久久久久| 午夜69成人做爰视频| 日韩av网址在线| 国产激情欧美| 人妻av无码专区| 国产人伦精品一区二区| 91精品国产乱码久久久| 欧美激情第1页| 欧美美乳视频| 一级黄色高清视频| 久久九九全国免费| 国产精品久久欧美久久一区| 久久久中文字幕| 成人精品影院| 国产传媒免费观看| 五月婷婷久久综合| av一区在线观看| 成人免费视频视频在| 亚洲精品四区| 精品无码国产污污污免费网站| 91福利在线看| 免费在线看黄色| 精品无码久久久久久久动漫| 国内精品国产三级国产a久久| 亚洲精品国产精品乱码| 日韩一二三在线视频播|