摘要:前期做任何一件事情都要有個前期準備工作。作為的規定,我們命名空間得有一個祖宗名字,這里我叫他神圣的至少需要一個庫來存儲這個項目創建一個文件用于進行包管理灰常簡單,搞進來。
前言
從本章開始,我們繼續造輪子,去完成一款類似于Laravel的現代化PHP框架,為什么說是現代化?因為他必須具備一下幾點
遵守PSR-4編碼規范
使用Composer進行包管理
標準的HTTP請求方式
優雅的使用設計模式
開始我們無需關心性能問題,先考慮框架具體需要實現哪些功能,這與實現業務就大不相同了,來!開始我的表演。
前期做任何一件事情都要有個前期準備工作。
作為PSR-4的規定,我們命名空間得有一個祖宗名字,這里我叫他神圣的 《z_framework》
至少需要一個GITHUB庫來存儲這個項目 https://github.com/CrazyCodes...
創建一個composer.json文件用于進行包管理,灰常簡單,phpunit搞進來。通過psr-4加載個項目命名
{ "name": "z framework", "require-dev": { "phpunit/phpunit": "^7.0" }, "autoload": { "psr-4": { "Zero": "src/Zero", } }, "autoload-dev": { "psr-4": { "ZeroTests": "tests/" } } }
最后我們就需要考慮下目錄的結構及其我們第一步要完成的功能,核心的結構(這里并非只的項目結構哦。是框架的核心結構)暫且是這樣
src
Zero
Config // 可能存放一些配置文件的解析器
Container // 容器的解析器
Http // 請求處理的一些工具
Routes // 路由處理的一些功能
Bootstrap.php // 這可能是一個啟動腳本
Zero.php // 可能是核心的入口文件
tests // 測試目錄
.gitignore
composer.json
LICENSE
README.md
路由還記得第一次使用Laravel時我們第一步做的事情嗎?是的,去研究路由,所以我們把路由作為框架的第一步。在研究路由前,我們要知道
http://www.domain.com/user/create
是如何實現的,php默認是必須請求index.php或者default.php的,上述鏈接實際隱藏了index.php或default.php ,這是Nginx等服務代理幫我們做到的優雅的鏈接,具體配置如下,實際與Laravel官方提供無差別
server { listen 80; server_name www.zf.com; root /mnt/app/z_framework/server/public; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ .php$ { fastcgi_pass php71:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
通過
try_files $uri $uri/ /index.php?$query_string;
去解析請求,通過上述可以得出
http://www.domain.com/user/create ======= http://www.domain.com/index.php?user/create
好了,明白了其中奧秘后,我們開始路由的編寫,在src/Routes/Route.php
namespace ZeroRoutes; class Route { }實現
首先我們先創建一個簡單的接口文件
src/Routes/RouteInterface.php
namespace ZeroRoutes; interface RouteInterface { public function Get($url, $callFile); public function Post($url, $callFile); public function Put($url, $callFile); public function Delete($url, $callFile); }
從Get請求開始
namespace ZeroRoutes; class Route implements RouteInterface { public function Get($url, $callFile) { } }
最后實現Get代碼塊
if (parent::isRequestMethod("GET")) { // 判讀請求方式 if (is_callable($callFile)) { // 判斷是否是匿名函數 return $callFile(); } if ($breakUpString = parent::breakUpString($callFile)) { // 獲取Get解析。既/user/create header("HTTP/1.1 404 Not Found"); } try { // 通過反射類獲取對象 $breakUpString[0] = user $reflectionClass = new ReflectionClass("AppControllers" . $breakUpString[0]); // 實例化對象 $newInstance = $reflectionClass->newInstance(); // 獲取對象中的指定方法,$breakUpString[1] = create call_user_func([ $newInstance, $breakUpString[1], ], []); } catch (ReflectionException $e) { header("HTTP/1.1 404 Not Found"); } } else { header("HTTP/1.1 404 Not Found"); } return "";
如果你想測試上述代碼,可使用phpunit,或者傻大粗的方式,這里便于理解使用傻大粗的方式
創建一個目錄,隨后按照Laravel的目錄形式創建幾個目錄,
最后public/index.php文件中去調用路由
require_once "../../vendor/autoload.php"; Zeroero::Get("user", "UserController@create");到這里我們就基本完成了路由的功能,下一章將完善路由的編碼
致謝感謝你看到這里,希望本篇可以幫到你。具體代碼在 https://github.com/CrazyCodes...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29755.html
摘要:先從開始參照規定設定接口方法分別為,當然也是規范了以上標準請求。查看存儲是否符合預期。包括測試對路由創建后是否為的實現。具體可查看致謝上述已完成了路由的基本設計,下一章將講解從啟動到請求路由映射到服務腳本的過程。 showImg(https://segmentfault.com/img/bVbk35Y?w=800&h=450); 前言 上一篇的標題改了一下,以一、二、三為章節對讀者來說...
摘要:這大概是我沒有及早使用,或多數開發者流連現狀造成的。它就是,一個的框架。行為驅動開發是來自測試驅動開發的開發過程。簡單的說,它就是經常可能一天幾次將小塊代碼整合進基礎代碼當中的行為。 showImg(https://segmentfault.com/img/remote/1460000013769815); 這是一篇社區協同翻譯的文章,已完成翻譯,更多信息請點擊?協同翻譯介紹?。 文章...
摘要:畢竟,我們還將在接下來的開發之旅中使用其他框架開發者編寫的輔助包。缺乏行業標準必然意味著,框架中的這些組件高度耦合。如果你嘗試對這個類進行單元測試,會發現根本不可行。在做單元測試的時候,我們可以很好地模擬數據庫連接,并將其傳入使用。 showImg(https://segmentfault.com/img/remote/1460000014180802); 我為你們準備了一個富有挑戰性...
摘要:每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷安全和有效。官方網站是一款老牌的框架,現在穩定版本已經是了。官方網站是由最大的社區之一的管理開發的,也是一個開源的框架。 對于Web開發者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網站都是基于PHP開發的。 每一個開發者都知道,擁有一個強大的框架可以讓開發工作變得更加快捷、安全和有效。在開發項目之前選...
摘要:核心變化從第一版發布以來,社區發生了巨大變化。這意味著系統必須全部重寫。暫時不會為一個即將停止支持的版本發布新版本。路由路由功能將被更新。改進的日志系統日志系統將被改進,但具體細節尚未確定。第一階段第一階段將側重于抓住框架最重要的部分。 我們綜合考慮了社區的愿望和意見后,也對什么樣的未來對 CI 是最合適的做了一些思考,然后,CI 理事會對框架的未來做出了一些決策。預告一下,未來將會有...
閱讀 1211·2021-09-30 09:47
閱讀 3763·2021-09-06 15:02
閱讀 1775·2021-09-01 10:46
閱讀 2359·2019-08-30 15:52
閱讀 593·2019-08-29 15:28
閱讀 1873·2019-08-29 15:08
閱讀 1149·2019-08-29 13:28
閱讀 2573·2019-08-29 12:19