国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

來!狂擼一款PHP現(xiàn)代化框架 (路由的設(shè)計(jì))

trilever / 3130人閱讀

摘要:先從開始參照規(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ù)腳本的過程。

前言

上一篇的標(biāo)題改了一下,以一、二、三為章節(jié)對(duì)讀者來說是種困擾,現(xiàn)在的標(biāo)題是依照項(xiàng)目進(jìn)度來編寫的。上篇文章地址為 https://segmentfault.com/a/11...

這一系列文章并不準(zhǔn)備寫太多章節(jié),大概規(guī)劃的只有4~5章左右,具體實(shí)現(xiàn)代碼還請(qǐng)移步Github
https://github.com/CrazyCodes...

本章詳細(xì)講解一下Route(路由的實(shí)現(xiàn)),Come on Up Image

上圖大概說明了實(shí)現(xiàn)路由要經(jīng)過兩個(gè)步驟

將所有路由信息存儲(chǔ)到超全局變量中

用戶請(qǐng)求時(shí)從全局變量中查找路由映射的服務(wù)腳本并實(shí)例化

OK,大概流程就是醬紫,下面開始“擼”

目錄

路由的代碼暫分為以下幾個(gè)文件(這并不是確定的,詳細(xì)可查看Github)

文件名 注釋
Route 轉(zhuǎn)發(fā)文件:為實(shí)現(xiàn) Route::get 效果
RouteCollection 路由信息處理存儲(chǔ)
RouteInterface 無(wú)需解釋
RouteModel 路由模型,將每個(gè)路由信息以結(jié)構(gòu)體方式存儲(chǔ)到$_SERVER
Router 路由的核心類

莫急,我們一個(gè)一個(gè)文件來看。先從RouteInterface開始

RouteInterface

參照RESTful規(guī)定設(shè)定接口方法分別為 GET、POST、PATCH、PUT、DELETE、OPTIONS,當(dāng)然Laravel也是規(guī)范了以上標(biāo)準(zhǔn)請(qǐng)求。

GitHub : https://github.com/CrazyCodes...

interface RouteInterface
{
    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function get($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function post($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function patch($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function put($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function delete($uri, $action = null);

    /**
     * @param      $uri
     * @param null $action
     *
     * @return mixed
     */
    public function options($uri, $action = null);
}
Router

先寫一個(gè)栗子

public function get($uri, $action = null)
{
    return $this->addRoute("GET", $uri, $action);
}

用戶調(diào)用下方代碼會(huì)指向上述方法,方法既調(diào)用addRoute方法將路由信息存儲(chǔ)到$_SERVER中

Route::get("/","Controller")

以下為addRoute部分的代碼

public function addRoute($methods, $uri, $action)
{
    // 這里判斷請(qǐng)求方式是否合規(guī),既是否存在  GET、POST、PATCH、PUT、DELETE、OPTIONS其中之一
    if ($this->verify($methods) == false) {
        return false;
    }
    
    // 之后我們?nèi)ネ鵕outeCollection路由信息的處理類中
    return $this->routes->add($uri, $this->createRoute($methods, $action));
}
RouteCollection

最終達(dá)到 add 方法,將路由信息存儲(chǔ)到$_SERVER中

public function add($uri, RouteModel $model)
{
    if (empty($_SERVER["routes"][$uri])) {
        $_SERVER["routes"][$uri] = $model;
    }
}

第二個(gè)參數(shù)RouteModel開始我們說過這是路由模型,將每個(gè)路由以結(jié)構(gòu)體的方式存儲(chǔ)到變量中,存儲(chǔ)后的結(jié)果

"routes" =>
  array(6) {
    "test/get" =>
    class ZeroRoutingRouteModel#13 (2) {
      public $method =>
      string(3) "GET"
      public $action =>
      string(19) "testController@test"
    }
    "test/post" =>
    class ZeroRoutingRouteModel#14 (2) {
      public $method =>
      string(4) "POST"
      public $action =>
      string(19) "testController@test"
    }
    "test/put" =>
    class ZeroRoutingRouteModel#15 (2) {
      public $method =>
      string(3) "PUT"
      public $action =>
      string(18) "testController@put"
    }
    "test/del" =>
    class ZeroRoutingRouteModel#16 (2) {
      public $method =>
      string(6) "DELETE"
      public $action =>
      string(18) "testController@del"
    }
    "test/patch" =>
    class ZeroRoutingRouteModel#17 (2) {
      public $method =>
      string(5) "PATCH"
      public $action =>
      string(20) "testController@patch"
    }
    "test/opt" =>
    class ZeroRoutingRouteModel#18 (2) {
      public $method =>
      string(7) "OPTIONS"
      public $action =>
      string(18) "testController@opt"
    }
  }
Route

最后通過__callStatic將代碼重定向到核心類中

public static function __callStatic($name, $arguments)
{
    $router = new Router;
    
    return $router->{$name}($arguments[0], $arguments[1]);
}

上述套路部分是Laravel的設(shè)計(jì)思想,通過這款簡(jiǎn)單的框架可對(duì)Laravel核心設(shè)計(jì)有丁點(diǎn)的理解。

測(cè)試

測(cè)試上次做的有點(diǎn)糙,從本章到系列結(jié)束,我們都以PHPunit來測(cè)試。

/**
 * @content tests all methods storage -> $_SERVER["routes"]
 */
public function testAllMethodsStorage()
{
    $this->routes->get($methodGet = "test/get", "testController@test");
    $this->assertArrayHasKey($methodGet, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->post($methodPost = "test/post", "testController@test");
    $this->assertArrayHasKey($methodPost, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->put($methodPut = "test/put", "testController@put");
    $this->assertArrayHasKey($methodPut, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->delete($methodDel = "test/del", "testController@del");
    $this->assertArrayHasKey($methodDel, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->patch($methodPatch = "test/patch", "testController@patch");
    $this->assertArrayHasKey($methodPatch, $_SERVER[$this->methodsDataKey]);
    
    $this->routes->options($methodOpt = "test/opt", "testController@opt");
    $this->assertArrayHasKey($methodOpt, $_SERVER[$this->methodsDataKey]);
}

上述貼出部分代碼,以過程化的方法去測(cè)試。查看存儲(chǔ)是否符合預(yù)期。

/**
 * @content RouteModel Success
 */
public function testCreateRoute()
{
    $response = $this->routes->createRoute("GET", "TestController@Get");
    
    $this->assertInstanceOf(RouteModel::class, $response);
}

包括測(cè)試對(duì)路由創(chuàng)建后是否為RouteModel的實(shí)現(xiàn)。具體可查看Github
https://github.com/CrazyCodes...

致謝

上述已完成了路由的基本設(shè)計(jì),下一章將講解從啟動(dòng)到請(qǐng)求路由映射到服務(wù)腳本的過程。

希望本章可以幫到你,謝謝。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/29805.html

相關(guān)文章

  • !狂擼一款PHP現(xiàn)代化框架 (準(zhǔn)備工作)

    摘要:前期做任何一件事情都要有個(gè)前期準(zhǔn)備工作。作為的規(guī)定,我們命名空間得有一個(gè)祖宗名字,這里我叫他神圣的至少需要一個(gè)庫(kù)來存儲(chǔ)這個(gè)項(xiàng)目創(chuàng)建一個(gè)文件用于進(jìn)行包管理灰常簡(jiǎn)單,搞進(jìn)來。 showImg(https://segmentfault.com/img/bVbkFcs?w=800&h=450); 前言 從本章開始,我們繼續(xù)造輪子,去完成一款類似于Laravel的現(xiàn)代化PHP框架,為什么說是現(xiàn)代...

    JellyBool 評(píng)論0 收藏0
  • 通過實(shí)現(xiàn)依賴注入和路由,構(gòu)建一個(gè)自己現(xiàn)代化PHP框架

    摘要:依賴注入通過構(gòu)造注入,函數(shù)調(diào)用或者屬性的設(shè)置來提供組件的依賴關(guān)系。這段代碼可以用依賴注入重構(gòu),從而解耦現(xiàn)在我們通過外界給予類的依賴,而不是讓它自己產(chǎn)生依賴的對(duì)象。根據(jù)依賴注入的概念,我們的框架實(shí)現(xiàn)了這些特性。 如何提高自己編寫代碼的能力呢?我們首先想到的是閱讀學(xué)習(xí)優(yōu)秀的開源項(xiàng)目,然后寫一個(gè)自己的web框架或類庫(kù)組件。作為web開發(fā)者,我們通常都是基于面向?qū)ο驩OP來開發(fā)的,所以面向?qū)ο?..

    waltr 評(píng)論0 收藏0
  • 你不可不知道20個(gè)優(yōu)秀PHP框架

    摘要:每一個(gè)開發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開發(fā)工作變得更加快捷安全和有效。官方網(wǎng)站是一款老牌的框架,現(xiàn)在穩(wěn)定版本已經(jīng)是了。官方網(wǎng)站是由最大的社區(qū)之一的管理開發(fā)的,也是一個(gè)開源的框架。 對(duì)于Web開發(fā)者來說,PHP是一款非常強(qiáng)大而又受歡迎的編程語(yǔ)言。世界上很多頂級(jí)的網(wǎng)站都是基于PHP開發(fā)的。 每一個(gè)開發(fā)者都知道,擁有一個(gè)強(qiáng)大的框架可以讓開發(fā)工作變得更加快捷、安全和有效。在開發(fā)項(xiàng)目之前選...

    zombieda 評(píng)論0 收藏0
  • 看吧,這就是現(xiàn)代化 PHP 該有樣子

    摘要:這大概是我沒有及早使用,或多數(shù)開發(fā)者流連現(xiàn)狀造成的。它就是,一個(gè)的框架。行為驅(qū)動(dòng)開發(fā)是來自測(cè)試驅(qū)動(dòng)開發(fā)的開發(fā)過程。簡(jiǎn)單的說,它就是經(jīng)常可能一天幾次將小塊代碼整合進(jìn)基礎(chǔ)代碼當(dāng)中的行為。 showImg(https://segmentfault.com/img/remote/1460000013769815); 這是一篇社區(qū)協(xié)同翻譯的文章,已完成翻譯,更多信息請(qǐng)點(diǎn)擊?協(xié)同翻譯介紹?。 文章...

    Tangpj 評(píng)論0 收藏0
  • QueryPHP V1-beta.1 部分文檔代碼解耦,版本PHP 7.3.2

    摘要:百分之百單元測(cè)試覆蓋直面一劍封喉,基于實(shí)現(xiàn)框架常駐,依托生態(tài)實(shí)現(xiàn)業(yè)務(wù)常駐,此刻未來逐步漸進(jìn)。國(guó)際化例子函數(shù)隨機(jī)數(shù)字優(yōu)化最開始采用的的繼承一個(gè)基礎(chǔ)的,方便單元測(cè)試有一定性能損失。 經(jīng)過 1 個(gè)月的開發(fā),QueryPHP v1.0.0-beta.1 版本可以發(fā)布了,這也是 beta 3 個(gè)版本的開始部分。這個(gè)版本的主要是代碼解耦和性能提升,文檔開發(fā)。 關(guān)于 QueryPHP QueryPH...

    lentrue 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<