摘要:前期做任何一件事情都要有個前期準備工作。作為的規(guī)定,我們命名空間得有一個祖宗名字,這里我叫他神圣的至少需要一個庫來存儲這個項目創(chuàng)建一個文件用于進行包管理灰常簡單,搞進來。
前言
從本章開始,我們繼續(xù)造輪子,去完成一款類似于Laravel的現(xiàn)代化PHP框架,為什么說是現(xiàn)代化?因為他必須具備一下幾點
遵守PSR-4編碼規(guī)范
使用Composer進行包管理
標準的HTTP請求方式
優(yōu)雅的使用設(shè)計模式
開始我們無需關(guān)心性能問題,先考慮框架具體需要實現(xiàn)哪些功能,這與實現(xiàn)業(yè)務(wù)就大不相同了,來!開始我的表演。
前期做任何一件事情都要有個前期準備工作。
作為PSR-4的規(guī)定,我們命名空間得有一個祖宗名字,這里我叫他神圣的 《z_framework》
至少需要一個GITHUB庫來存儲這個項目 https://github.com/CrazyCodes...
創(chuàng)建一個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/" } } }
最后我們就需要考慮下目錄的結(jié)構(gòu)及其我們第一步要完成的功能,核心的結(jié)構(gòu)(這里并非只的項目結(jié)構(gòu)哦。是框架的核心結(jié)構(gòu))暫且是這樣
src
Zero
Config // 可能存放一些配置文件的解析器
Container // 容器的解析器
Http // 請求處理的一些工具
Routes // 路由處理的一些功能
Bootstrap.php // 這可能是一個啟動腳本
Zero.php // 可能是核心的入口文件
tests // 測試目錄
.gitignore
composer.json
LICENSE
README.md
路由還記得第一次使用Laravel時我們第一步做的事情嗎?是的,去研究路由,所以我們把路由作為框架的第一步。在研究路由前,我們要知道
http://www.domain.com/user/create
是如何實現(xiàn)的,php默認是必須請求index.php或者default.php的,上述鏈接實際隱藏了index.php或default.php ,這是Nginx等服務(wù)代理幫我們做到的優(yōu)雅的鏈接,具體配置如下,實際與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 { }實現(xiàn)
首先我們先創(chuàng)建一個簡單的接口文件
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) { } }
最后實現(xiàn)Get代碼塊
if (parent::isRequestMethod("GET")) { // 判讀請求方式 if (is_callable($callFile)) { // 判斷是否是匿名函數(shù) 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,或者傻大粗的方式,這里便于理解使用傻大粗的方式
創(chuàng)建一個目錄,隨后按照Laravel的目錄形式創(chuàng)建幾個目錄,
最后public/index.php文件中去調(diào)用路由
require_once "../../vendor/autoload.php"; Zeroero::Get("user", "UserController@create");到這里我們就基本完成了路由的功能,下一章將完善路由的編碼
致謝感謝你看到這里,希望本篇可以幫到你。具體代碼在 https://github.com/CrazyCodes...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29755.html
摘要:先從開始參照規(guī)定設(shè)定接口方法分別為,當然也是規(guī)范了以上標準請求。查看存儲是否符合預(yù)期。包括測試對路由創(chuàng)建后是否為的實現(xiàn)。具體可查看致謝上述已完成了路由的基本設(shè)計,下一章將講解從啟動到請求路由映射到服務(wù)腳本的過程。 showImg(https://segmentfault.com/img/bVbk35Y?w=800&h=450); 前言 上一篇的標題改了一下,以一、二、三為章節(jié)對讀者來說...
摘要:這大概是我沒有及早使用,或多數(shù)開發(fā)者流連現(xiàn)狀造成的。它就是,一個的框架。行為驅(qū)動開發(fā)是來自測試驅(qū)動開發(fā)的開發(fā)過程。簡單的說,它就是經(jīng)??赡芤惶鞄状螌⑿K代碼整合進基礎(chǔ)代碼當中的行為。 showImg(https://segmentfault.com/img/remote/1460000013769815); 這是一篇社區(qū)協(xié)同翻譯的文章,已完成翻譯,更多信息請點擊?協(xié)同翻譯介紹?。 文章...
摘要:畢竟,我們還將在接下來的開發(fā)之旅中使用其他框架開發(fā)者編寫的輔助包。缺乏行業(yè)標準必然意味著,框架中的這些組件高度耦合。如果你嘗試對這個類進行單元測試,會發(fā)現(xiàn)根本不可行。在做單元測試的時候,我們可以很好地模擬數(shù)據(jù)庫連接,并將其傳入使用。 showImg(https://segmentfault.com/img/remote/1460000014180802); 我為你們準備了一個富有挑戰(zhàn)性...
摘要:每一個開發(fā)者都知道,擁有一個強大的框架可以讓開發(fā)工作變得更加快捷安全和有效。官方網(wǎng)站是一款老牌的框架,現(xiàn)在穩(wěn)定版本已經(jīng)是了。官方網(wǎng)站是由最大的社區(qū)之一的管理開發(fā)的,也是一個開源的框架。 對于Web開發(fā)者來說,PHP是一款非常強大而又受歡迎的編程語言。世界上很多頂級的網(wǎng)站都是基于PHP開發(fā)的。 每一個開發(fā)者都知道,擁有一個強大的框架可以讓開發(fā)工作變得更加快捷、安全和有效。在開發(fā)項目之前選...
摘要:核心變化從第一版發(fā)布以來,社區(qū)發(fā)生了巨大變化。這意味著系統(tǒng)必須全部重寫。暫時不會為一個即將停止支持的版本發(fā)布新版本。路由路由功能將被更新。改進的日志系統(tǒng)日志系統(tǒng)將被改進,但具體細節(jié)尚未確定。第一階段第一階段將側(cè)重于抓住框架最重要的部分。 我們綜合考慮了社區(qū)的愿望和意見后,也對什么樣的未來對 CI 是最合適的做了一些思考,然后,CI 理事會對框架的未來做出了一些決策。預(yù)告一下,未來將會有...
閱讀 1217·2021-09-30 09:47
閱讀 3769·2021-09-06 15:02
閱讀 1781·2021-09-01 10:46
閱讀 2364·2019-08-30 15:52
閱讀 601·2019-08-29 15:28
閱讀 1874·2019-08-29 15:08
閱讀 1154·2019-08-29 13:28
閱讀 2580·2019-08-29 12:19