代碼簡單,功能簡便,PHP 新手也能看懂。
以下是搭建過程做的一個小記錄:
1. 使用 composer 實現文件自動加載
比起 spl_autoload_register() ,顯然 composer 更簡單跟強大,
2. 路由解析
實現訪問 http://domain.com/index.php/index/index 時指向 /appliction/controller/Index.php 的 index()方法
其實只是通過 $_SERVER 獲取 http://url.com/ctl/act 的 ctl 和 act 的值,
直接調用 ctl 控制器 act 方法即可(前提要實現 自動加載,否則需要手動 include ctl 類)
部分代碼:
// 獲取 url.com/ctl/act 的ctl 和 act
$arr_path = explode("/",trim($_SERVER["PATH_INFO"],"/"));
$controller = $arr_path[0] ?? "Index";
$action = $arr_path[1] ?? "index";
// 調用 ctl 類 的 act 方法;
$ctl_class = "\app\controller\\" . $controller;
print (new $ctl_class())->$action();
3. 視圖渲染
模仿 tp 的$this->fetch()方法,先創建父級控制器/Controller.php, fetch() 方法。
所謂實現功能僅只是加載 'view\ctl\act.php' 文件而已;
(參數傳遞的實現留意下extract() 方法,它和compact()方法一樣在開發中非常好用)
部分代碼:
public function fetch($file = "",$assign = []){
// 獲取路由
$route = Router::getInstance();
// 目錄
$view_dir = APP_PATH . "view" . DS . $route->controller . DS;
// 路徑
$view_path = ! $file
? $view_dir . $route->action . ".php"
: $view_dir . $file . ".php";
// 參數傳遞
extract($assign);
is_file($view_path) ? require ($view_path) : exit($view_path . "文件不存在");
}
添枝加葉
通過 1,2,3 步驟其實已經搭建出框架的基本結構,以下僅爲添枝加葉:
a. 加載公共方法庫
a. 將解析路由代碼封裝成類/system/library/Router.php,於 App::run() 方法調用
a. 創建數據庫類/system/library/Db.php,(僅繼承mysqli類,其它功能待實現)
a. 封裝配置類/system/library/Config.php,實現加載配置規則。
以下是全部的文件👇
www WEB部署目錄
├─application 應用目錄
│ ├─controller 控制器目錄
│ ├─view 視圖目錄
│ │ ├─ctl 控制器對應目錄
│ │ │ ├─act.php 對應視圖文件
│ │ │ └─ ... 更多視圖文件
│ │ └─ ... 更多控制器對應目錄
│ ├─common.php 公共函數文件
│ ├─config.php 自定義配置文件
├─config 應用配置目錄
│ ├─app.php 應用配置
│ ├─database.php 數據庫配置
├─public 對外訪問目錄
│ ├─index.php 入口文件
│ ├─.htaccess 用於apache的重寫
├─system 框架系統目錄
│ ├─library 框架類庫目錄
│ │ ├─App.php 啓動類庫
│ │ ├─Cache.php 緩存類庫
│ │ ├─Config.php 配置類庫
│ │ ├─Controller.php 控制器父類
│ │ ├─Db.php 數據庫類庫
│ │ ├─Log.php 日誌類庫
│ │ ├─Mysql.php mysqli基礎類庫
│ │ ├─Router.php 路由類庫
│ │ ├─Singleton.php 單例 Trait 類(多繼承)
│ ├─base.php 基礎定義文件
│ ├─function.php 框架內置函數庫
├─vendor 第三方類庫目錄Composer依賴庫
├─composer.json composer 定義文件
├─README.md README 文件
框架簡單粗暴,代碼易讀易擴展,性能接近原生,需要擴展功能直接封裝或 composer 引用開源代碼。