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