來!狂擼一款 PHP 現代化框架 (一)

2021-02-19 SegmentFault
前言

從本章開始,我們繼續造輪子,去完成一款類似於Laravel的現代化PHP框架,為什麼說是現代化?因為他必須具備一下幾點:

前期

做任何一件事情都要有個前期準備工作。

1、作為PSR-4的規定,我們命名空間得有一個祖宗名字,這裡我叫他神聖的 《z_framework》。

2、至少需要一個GITHUB庫來存儲這個項目:https://github.com/CrazyCodes/z_framework。

3、創建一個composer.json文件用於進行包管理,灰常簡單,phpunit搞進來。通過psr-4加載個項目命名。

   {

     "name": "z framework",

     "require-dev": {

       "phpunit/phpunit": "^7.0"

     },

     "autoload": {

       "psr-4": {

         "Zero\\": "src/Zero",

       }

     },

     "autoload-dev": {

       "psr-4": {

         "Zero\\Tests\\": "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 Zero\Routes;

class Route

{

}

實現

首先我們先創建一個簡單的接口文件 src/Routes/RouteInterface.php:

namespace Zero\Routes;

interface RouteInterface

{

   public function Get($url, $callFile);

   public function Post($url, $callFile);

   public function Put($url, $callFile);

   public function Delete($url, $callFile);

}

從Get請求開始:

namespace Zero\Routes;

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('App\\Controllers\\' . $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的目錄形式創建幾個目錄:

<?php

namespace App\Controllers;

class UserController

{

   public function create()

   {

      var_dump(0);

   }

}

最後public/index.php文件中去調用路由:

require_once "../../vendor/autoload.php";

Zero\Zero::Get("user", "UserController@create");

到這裡我們就基本完成了路由的功能,下一章將完善路由的編碼。

致謝

感謝你看到這裡,希望本篇可以幫到你。具體代碼在 https://github.com/CrazyCodes/z_framework。

歡迎關注 SegmentFault 微信公眾號 :)

相關焦點

  • 來!狂擼一款PHP現代化框架 (準備工作)
    前言從本章開始,我們繼續造輪子,去完成一款類似於Laravel的現代化PHP框架,為什麼說是現代化?因為他必須具備一下幾點遵守PSR-4編碼規範使用Composer進行包管理標準的HTTP請求方式優雅的使用設計模式開始我們無需關心性能問題,先考慮框架具體需要實現哪些功能,這與實現業務就大不相同了,來!開始我的表演。前期做任何一件事情都要有個前期準備工作。
  • 【PHP】優雅的框架 —— Laravel入門系列(一)
    請確保你的伺服器滿足以下要求(^_^):安裝 LaravelLaravel 使用 Composer 來管理項目依賴。因此,在使用 Laravel 之前,請確保你的設備已經安裝了 Composer。Laravel 框架的所有配置文件均放在config目錄下,每個選項均有注釋,你可以隨時隨地的閱讀和熟悉每個可用的選項是不是很優雅呀,這就是 Laravel 框架嘛,i 了 i 了為了確保項目可以正常運作,請為storage和boots、cache目錄設置讀寫權限。
  • 這些最熱門的 PHP 框架,哪一款是你的菜?
    PHP 框架的概述和比較,讓開發者能夠根據自己的具體情況選擇一款最適合自己的框架。本文將通過 3 款最流行的 PHP 框架:Symfony, Laravel, 和 Yii 的比較,來幫助你找到最適合的 PHP 框架。下面列出了一些使用 PHP 框架進行開發的好處:PHP 框架使開發更快。
  • 使用PHP框架的十大好處
    不會因為你新建了一個/inc的文件夾,然後在裡面寫function.php文件,就能說明你的代碼有組織了。
  • PHP中的MySQLi擴展學習(一)MySQLi介紹
    本身它們其實並沒有什麼太大的差別,不過現代化的大型框架中基本都會將 PDO 作為默認的資料庫連接來進行封裝,畢竟它的可移植性可以方便這些通用框架連接不同的資料庫。而一些小型的框架或項目中,還是能夠見到 MySQLi 的身影。當然,小眾並不意味著不好,就像日常開發中,我們很少會在 PHP 環境中使用別的資料庫,那麼在自己的小項目中完全使用一套 MySQLi 來操作資料庫反而更加地方便快捷。
  • 給 PHP 程式設計師的 10 款最佳 IDE
    那選擇哪一款呢, 這個問題要看你的需求、偏好和預算。 選定一款之前試用幾個也不錯。大量PHP開發軟體支持跨平臺系統,能用於Windows,Linux和Mac,而且提供免費下載。 對於初學者,我的建議是,你可以隨意選擇一款免費的,可用就行。 比如:NetBeans,VIM,Atom或Eclipse PDT。
  • 一款針對WordPress網站的滲透測試框架
    今天給大家介紹的是一款名叫Wordpress Exploit Framework的Ruby框架,研究人員可利用該框架來研發或使用其自帶某開來對由
  • 常見的25種php框架
    「php是世界上最好的語言」我不敢肯定,但是至少php為我們的web開發做了很大的貢獻,毋庸置疑,php是我們web界的一大功臣,
  • phpspider簡單快速上手的php爬蟲框架
    雖然python爬蟲方便,但是php在這方面也不弱,誰讓php是世界上最好的語言!這裡推薦一款php的爬蟲框架phpspider。不建議自己寫爬蟲,因為效率太低。使用框架爬蟲真的要高效許多官方文檔:https://doc.phpspider.org/1、下載官方github下載地址:https://github.com/owner888/phpspider下載地址可能無法訪問,這裡提供一個網盤下載地址:
  • 手把手編寫自己的PHPMVC框架實例教程
    3 開始開發自己的MVC框架3.1 目錄準備在開始開發前,讓我們先來把項目建立好,假設我們建立的項目為 todo,MVC的框架可以命名為 FastPHP,那麼接下來的第一步就是把目錄結構先設置好。下面就具體說說每個目錄的作用:application – 應用代碼config – 程序配置或資料庫配置fastphp - 框架核心目錄public – 靜態文件runtime - 臨時數據目錄scripts – 命令行工具3.2 代碼規範在目錄設置好以後,我們接下來就要來規定一下代碼的規範
  • 十分鐘就能快速上手的PHP爬蟲框架
    是一個爬蟲開發框架。使用該框架,您不用了解爬蟲的堆疊技術實現,爬蟲被網站屏蔽,有些網站需要登錄或驗證碼識別才能爬取等問題。簡單幾行PHP代碼,就可以創建自己的爬蟲,利用框架封裝的多進程Worker類庫,代碼更簡潔,執行效率更高的速度轉換但是,該框架只能在命令行下運行。
  • 手把手編寫自己的 PHP MVC 框架實例教程
    更重要的是,你可以完全控制你的框架,並將你的想法融入到你開發的框架中。雖然不一定是做好的,但是你可以按照你的方式去開發功能和模塊。3 開始開發自己的MVC框架3.1 目錄準備在開始開發前,讓我們先來把項目建立好,假設我們建立的項目為 todo,MVC的框架可以命名為 FastPHP,那麼接下來的第一步就是把目錄結構先設置好。
  • GitHub 上最火的 PHP 框架
    深入了解點擊《快速入門最流行的 PHP 開發框架 Laravel》https://github.com/symfony/symfony Star 15114簡單的模板功能 Symfony 是一個開源的 PHP Web 框架。基於最佳 Web 開發實踐,已經有多個網站完全採用此框架開發,Symfony 的目的是加速Web應用的創建與維護。
  • yii、yaf、ci、Cake 等php框架性能對比
    yaf是遠程c寫的框架,整個php框架寫成了擴展。
  • 新手入門PHP之道一
    也就是說, 你可以通過 brew install 命令安裝 php53, php54, php55 或者 php56 ,並且通過修改 PATH 變量來切換各個版本。或者你也可以使用 brew-php-switcher 來自動切換。
  • mzphp:支持 scss 語法和 css sprite 的 PHP 框架
    mzphp 介紹PHP 開發框架 mzphp,擁有特點:性能,高性能極致加載
  • 擼一擼啟航
    ▲每日關注LOL,開啟擼之徵途來源:網絡,騰訊音樂。
  • 如何用PHP山寨一款軟體
    世界上根本就找不到一款我國工程師不能山寨的軟體。今天,鋒哥教大家來山寨一款軟體。最近,朋友圈傳的比較火的的一張圖是什麼?《xxx,七夕要發生的五件事》。如下圖:下面,我們通過這款世界級的程式語言PHP,來對它實現山寨。沒錯,PHP程式語言在編程界兵器榜排名第一,不服來辯,辯贏有獎!
  • Web程式設計師最常用的11款PHP框架
    今天我將為開發人員帶來幾款最好的PHP框架,希望能對你有用。1.AgaviAgavi是一款強大的,可擴展的PHP5應用框架,遵循MVC模式。它能夠讓開發人員編寫出整潔、可維護、可擴展的代碼。官方網站:http://www.agavi.org/2.FuelPHPFuel是一款簡單靈活、社區驅動的PHP5.3+框架。
  • 現代化 JavaScript 框架 Mithril 的簡單介紹及用法
    在這之前我是沒聽說過 Mithril的,就花了點時間去學習,發現關於這個框架的內容還是比較少的。這篇文章也是簡單整理了一下一些基礎的內容,算是學習筆記。一、Mithril 介紹1. 是什麼mithril 是一個小巧的、mvc 模式的、用於構建單頁面應用的現代化 JavaScript 框架。