摘要:我們先從目前用著最不爽的地方視圖裝載下手。實現裝載器完成基礎準備以后我們正式開始制造視圖裝載器。下一步利用完善自己的框架二發送郵件
原文發表在我的個人網站:利用 Composer 完善自己的 PHP 框架(一)——視圖裝載
本教程示例代碼見 https://github.com/johnlui/My-First-Framework-based-on-Composer
經過了上一個 系列教程 《利用 Composer 一步一步構建自己的 PHP 框架》,我們組建了一個具有 路由、MVC 架構 和 ORM 功能的基礎框架 MFFC。接下來我們繼續完善這個項目。
我們先從目前用著 最不爽 的地方——視圖裝載下手。我們將封裝一個視圖裝載類,讓它來幫我們裝載視圖,并把變量傳遞進視圖。這個類將只暴露出來幾個簡單的接口,讓我們在控制器里面用的爽,讓我們一邊寫代碼一邊笑。真的笑,笑出聲。:-D
視圖裝載類要做的工作其實很簡單:
根據視圖名稱找到視圖文件,支持文件夾
更加方便,更加優雅地把變量的值傳遞進視圖
本文中我們將不會不引入模板引擎,只做裝載文件和傳遞變量的功能。
基礎準備我們要引入視圖裝載器,這就正式打開了組件化的大門,所以我們需要做一些準備工作。
1. 啟動流程組件化
將 public/index.php 里面的代碼分離一部分到啟動器(bootstrap),新建 MFFC/bootstrap.php 文件:
addConnection(require BASE_PATH."/config/database.php"); $capsule->bootEloquent();
修改 public/index.php 為:
這時候我們就完成了 入口文件 和 啟動器 的分離,并定義了兩個全局常量 BASE_PATH 和 PUBLIC_PATH。
在這里我們需要特別注意一點:“引入路由配置文件” 這一步并不只是簡單地引入了一個配置文件,路由文件的最后一行 Macaw::dispatch(); 才是 真正執行某個控制器中某個 function 的地方,所有準備條件都應該在載入路由文件之前完成,例如 Eloquent 的初始化,還有以后我們要使用的 Composer 包的初始化等等。
2. 引入錯誤頁面提示組件
我們選擇 filp/whoops 作為我們錯誤提示組件包。
修改 composer.json:
"require": { "codingbean/macaw": "dev-master", "illuminate/database": "*", "filp/whoops": "*" },運行 composer update,然后在 bootstrap.php 的最后添加:
// whoops 錯誤提示 $whoops = new WhoopsRun; $whoops->pushHandler(new WhoopsHandlerPrettyPageHandler); $whoops->register();刷新 http://127.0.0.1:81 ,你得到的應該還是這個頁面:
下面我們將增加路由配置中 無匹配項 的錯誤頁面,修改 config/routes.php:
現在訪問一個隨意輸入的 URL,例如 http://127.0.0.1:81/asd ,我們會看到以下畫面:
是不是有一種很熟悉的感覺!
很不幸,這個錯誤提示包正是 Laravel 采用的那個,所以,我們可愛的 MFFC 框架在長大以后還是成了 Laravel 的樣子。%>_<%
實現裝載器完成基礎準備以后我們正式開始制造視圖裝載器。
視圖裝載器是一個可插拔組件,我們應該把所有可插拔組件全部歸到一處,在 MFFC 中建議放在 MFFC/services 下。
CI 框架提供的基礎組件庫叫 helpers,Laravel 使用 illuminate/support 包提供一些可重用的系統函數。實際上 “illuminate/support” 這個包已經被我們的 ORM 包 “illuminate/database” 依賴了,現在 MFFC 框架里面已經可以直接使用。,這個包的中文文檔見:http://laravel-china.org/docs/helpers
我們并沒有像 CI 框架那樣把視圖裝載器放到系統核心,有以下兩個原因:
基于命名空間與自動加載的調用方式更加節省資源
在移動互聯網和大前端愈演愈烈的時代,后端越來越 API 化、 json 化。很多時候都不到視圖,沒有必要再增加無畏的消耗。
下面開始著手實現視圖裝載器。
新建 MFFC/services 文件夾,并修改 composer.json 把這個文件夾下的所有類自動歸入根命名空間:
"autoload": { "classmap": [ "app/controllers", "app/models", "services" ] }新建 services/View.php 文件,內容如下:
view = $view; } public static function make($viewName = null) { if ( ! $viewName ) { throw new InvalidArgumentException("視圖名稱不能為空!"); } else { $viewFilePath = self::getFilePath($viewName); if ( is_file($viewFilePath) ) { return new View($viewFilePath); } else { throw new UnexpectedValueException("視圖文件不存在!"); } } } public function with($key, $value = null) { $this->data[$key] = $value; return $this; } private static function getFilePath($viewName) { $filePath = str_replace(".", "/", $viewName); return BASE_PATH.self::VIEW_BASE_PATH.$filePath.".php"; } public function __call($method, $parameters) { if (starts_with($method, "with")) { return $this->with(snake_case(substr($method, 4)), $parameters[0]); } throw new BadMethodCallException("方法 [$method] 不存在!."); } }運行 composer dump-autoload,完成以后,我們就可以在控制器中直接調用這個類了。
修改 controllers/HomeController.php:
view = View::make("home")->with("article",Article::first()) ->withTitle("MFFC :-D") ->withFuckMe("OK!"); } }修改 controllers/BaseController.php:
view; if ( $view instanceof View ) { extract($view->data); require $view->view; } } }修改 app/views/home.php:
刷新,你將看到以下頁面:
至此,視圖裝載器實現完成。
下面我大致說一下設計視圖裝載器的基本思路:
這個視圖裝載器類模仿了 Laravel 的 View 類,它實現了一個靜態方法 make,接受視圖名稱作為參數,以 . 作為目錄的間隔符。
make 靜態方法會檢查視圖名稱是否為空,檢查視圖文件是否存在,并給出相應的異常。這就是我們引入異常處理包的原因。
視圖名稱合法且文件存在時,實例化一個 View 類的對象,返回。
使用 with("key", $value) 或者優雅的 withKey($value) 來給這個 View 對象插入要在視圖里調用的變量。withFuckMe($value) 將采用蛇形命名法被轉化成 $fuck_me 供視圖使用。
最終組裝好的 View 對象會被賦給 HomeController 的成員變量 $view,這個變量是從 BaseController 中繼承得來。
父類 BaseController 中的析構函數 __destruct() 將在 function home() 執行完成后處理這個成員變量:extract 出視圖要用到的變量,require 視圖文件,將最終運算結果發送給瀏覽器,流程結束。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20853.html
摘要:原文發表在我的個人網站利用完善自己的框架三緩存本教程示例代碼見回顧上兩篇文章中我們完成了視圖加載類和郵件發送類的設計,完成了兩個可插拔組件。相比使用文件作為緩存,擁有更高的性能更好地可維護性和更強大的操作。 原文發表在我的個人網站:利用 Composer 完善自己的 PHP 框架(三)——Redis 緩存 本教程示例代碼見 https://github.com/johnlui/My...
摘要:原文發表在我的個人網站利用完善自己的框架三緩存本教程示例代碼見回顧上兩篇文章中我們完成了視圖加載類和郵件發送類的設計,完成了兩個可插拔組件。相比使用文件作為緩存,擁有更高的性能更好地可維護性和更強大的操作。 原文發表在我的個人網站:利用 Composer 完善自己的 PHP 框架(三)——Redis 緩存 本教程示例代碼見 https://github.com/johnlui/My...
說明 原文發表在我的個人網站:利用 Composer 完善自己的 PHP 框架(二)——發送郵件 本教程示例代碼見 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顧 上一篇文章中,我們手工建造了一個簡易的視圖加載器,順便引入了錯誤處理包,讓我們的 MFFC 框架在 M、V、C 三個方面都達到了好用的水平。V...
摘要:自動代碼擴展開發時遵守的代碼風格是項目開發規范。遵照此規范,在實際操作中,有許多重復,接下來推薦一款專為此規范量身定制的代碼生成器??梢岳么藬U展來快速構建項目原型。后續還會為大家帶來一些最新的技術擴展。 whoops 錯誤提示擴展 whoops 是一個非常優秀的 PHP Debug 擴展,它能夠使你在開發中快速定位出錯的位置。laravel默認安裝。showImg(https://s...
閱讀 3729·2021-11-24 09:39
閱讀 3444·2019-08-30 15:56
閱讀 1370·2019-08-30 15:55
閱讀 1031·2019-08-30 15:53
閱讀 1919·2019-08-29 18:37
閱讀 3601·2019-08-29 18:32
閱讀 3128·2019-08-29 16:30
閱讀 2918·2019-08-29 15:14