成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

利用 Composer 完善自己的 PHP 框架(一)——視圖裝載

LinkedME2016 / 2102人閱讀

摘要:我們先從目前用著最不爽的地方視圖裝載下手。實(shí)現(xiàn)裝載器完成基礎(chǔ)準(zhǔn)備以后我們正式開(kāi)始制造視圖裝載器。下一步利用完善自己的框架二發(fā)送郵件

原文發(fā)表在我的個(gè)人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(一)——視圖裝載


本教程示例代碼見(jiàn) https://github.com/johnlui/My-First-Framework-based-on-Composer


回顧

經(jīng)過(guò)了上一個(gè) 系列教程 《利用 Composer 一步一步構(gòu)建自己的 PHP 框架》,我們組建了一個(gè)具有 路由MVC 架構(gòu)ORM 功能的基礎(chǔ)框架 MFFC。接下來(lái)我們繼續(xù)完善這個(gè)項(xiàng)目。

我們先從目前用著 最不爽 的地方——視圖裝載下手。我們將封裝一個(gè)視圖裝載類,讓它來(lái)幫我們裝載視圖,并把變量傳遞進(jìn)視圖。這個(gè)類將只暴露出來(lái)幾個(gè)簡(jiǎn)單的接口,讓我們?cè)诳刂破骼锩嬗玫乃?,讓我們一邊寫代碼一邊笑。真的笑,笑出聲。:-D


正文 構(gòu)思

視圖裝載類要做的工作其實(shí)很簡(jiǎn)單:

根據(jù)視圖名稱找到視圖文件,支持文件夾

更加方便,更加優(yōu)雅地把變量的值傳遞進(jìn)視圖

本文中我們將不會(huì)不引入模板引擎,只做裝載文件和傳遞變量的功能。

基礎(chǔ)準(zhǔn)備

我們要引入視圖裝載器,這就正式打開(kāi)了組件化的大門,所以我們需要做一些準(zhǔn)備工作。

1. 啟動(dòng)流程組件化

public/index.php 里面的代碼分離一部分到啟動(dòng)器(bootstrap),新建 MFFC/bootstrap.php 文件:

addConnection(require BASE_PATH."/config/database.php");
$capsule->bootEloquent();

修改 public/index.php 為:



這時(shí)候我們就完成了 入口文件 和 啟動(dòng)器 的分離,并定義了兩個(gè)全局常量 BASE_PATHPUBLIC_PATH。


  

在這里我們需要特別注意一點(diǎn):“引入路由配置文件” 這一步并不只是簡(jiǎn)單地引入了一個(gè)配置文件,路由文件的最后一行 Macaw::dispatch(); 才是 真正執(zhí)行某個(gè)控制器中某個(gè) function 的地方,所有準(zhǔn)備條件都應(yīng)該在載入路由文件之前完成,例如 Eloquent 的初始化,還有以后我們要使用的 Composer 包的初始化等等。


2. 引入錯(cuò)誤頁(yè)面提示組件

我們選擇 filp/whoops 作為我們錯(cuò)誤提示組件包。

修改 composer.json

"require": {
  "codingbean/macaw": "dev-master",
  "illuminate/database": "*",
  "filp/whoops": "*"
},

運(yùn)行 composer update,然后在 bootstrap.php 的最后添加:

// whoops 錯(cuò)誤提示
$whoops = new WhoopsRun;
$whoops->pushHandler(new WhoopsHandlerPrettyPageHandler);
$whoops->register();

刷新 http://127.0.0.1:81 ,你得到的應(yīng)該還是這個(gè)頁(yè)面:

下面我們將增加路由配置中 無(wú)匹配項(xiàng) 的錯(cuò)誤頁(yè)面,修改 config/routes.php



現(xiàn)在訪問(wèn)一個(gè)隨意輸入的 URL,例如 http://127.0.0.1:81/asd ,我們會(huì)看到以下畫面:

是不是有一種很熟悉的感覺(jué)!

很不幸,這個(gè)錯(cuò)誤提示包正是 Laravel 采用的那個(gè),所以,我們可愛(ài)的 MFFC 框架在長(zhǎng)大以后還是成了 Laravel 的樣子。%>_<%

實(shí)現(xiàn)裝載器

完成基礎(chǔ)準(zhǔn)備以后我們正式開(kāi)始制造視圖裝載器。

視圖裝載器是一個(gè)可插拔組件,我們應(yīng)該把所有可插拔組件全部歸到一處,在 MFFC 中建議放在 MFFC/services 下。

CI 框架提供的基礎(chǔ)組件庫(kù)叫 helpers,Laravel 使用 illuminate/support 包提供一些可重用的系統(tǒng)函數(shù)。實(shí)際上 “illuminate/support” 這個(gè)包已經(jīng)被我們的 ORM 包 “illuminate/database” 依賴了,現(xiàn)在 MFFC 框架里面已經(jīng)可以直接使用。,這個(gè)包的中文文檔見(jiàn):http://laravel-china.org/docs/helpers

我們并沒(méi)有像 CI 框架那樣把視圖裝載器放到系統(tǒng)核心,有以下兩個(gè)原因:

基于命名空間與自動(dòng)加載的調(diào)用方式更加節(jié)省資源

在移動(dòng)互聯(lián)網(wǎng)和大前端愈演愈烈的時(shí)代,后端越來(lái)越 API 化、 json 化。很多時(shí)候都不到視圖,沒(méi)有必要再增加無(wú)畏的消耗。

下面開(kāi)始著手實(shí)現(xiàn)視圖裝載器。

新建 MFFC/services 文件夾,并修改 composer.json 把這個(gè)文件夾下的所有類自動(dòng)歸入根命名空間:

"autoload": {
  "classmap": [
    "app/controllers",
    "app/models",
    "services"
  ]
}

新建 services/View.php 文件,內(nèi)容如下:

view = $view;
  }

  public static function make($viewName = null)
  {
    if ( ! $viewName ) {
      throw new InvalidArgumentException("視圖名稱不能為空!");
    } else {

      $viewFilePath = self::getFilePath($viewName);
      if ( is_file($viewFilePath) ) {
        return new View($viewFilePath);
      } else {
        throw new UnexpectedValueException("視圖文件不存在!");
      }
    }
  }

  public function with($key, $value = null)
  {
    $this->data[$key] = $value;
    return $this;
  }

  private static function getFilePath($viewName)
  {
    $filePath = str_replace(".", "/", $viewName);
    return BASE_PATH.self::VIEW_BASE_PATH.$filePath.".php";
  }

  public function __call($method, $parameters)
  {
    if (starts_with($method, "with"))
    {
      return $this->with(snake_case(substr($method, 4)), $parameters[0]);
    }

    throw new BadMethodCallException("方法 [$method] 不存在!.");
  }
}

運(yùn)行 composer dump-autoload,完成以后,我們就可以在控制器中直接調(diào)用這個(gè)類了。

修改 controllers/HomeController.php

view = View::make("home")->with("article",Article::first())
                                    ->withTitle("MFFC :-D")
                                    ->withFuckMe("OK!");
  }
}

修改 controllers/BaseController.php

view;
    if ( $view instanceof View ) {
      extract($view->data);
      require $view->view;
    }
  }
}

修改 app/views/home.php




  
  <?php echo $title ?>


  

  • Fuck Me !

刷新,你將看到以下頁(yè)面:

至此,視圖裝載器實(shí)現(xiàn)完成。


下面我大致說(shuō)一下設(shè)計(jì)視圖裝載器的基本思路:

這個(gè)視圖裝載器類模仿了 Laravel 的 View 類,它實(shí)現(xiàn)了一個(gè)靜態(tài)方法 make,接受視圖名稱作為參數(shù),以 . 作為目錄的間隔符。

make 靜態(tài)方法會(huì)檢查視圖名稱是否為空,檢查視圖文件是否存在,并給出相應(yīng)的異常。這就是我們引入異常處理包的原因。

視圖名稱合法且文件存在時(shí),實(shí)例化一個(gè) View 類的對(duì)象,返回。

使用 with("key", $value) 或者優(yōu)雅的 withKey($value) 來(lái)給這個(gè) View 對(duì)象插入要在視圖里調(diào)用的變量。withFuckMe($value) 將采用蛇形命名法被轉(zhuǎn)化成 $fuck_me 供視圖使用。

最終組裝好的 View 對(duì)象會(huì)被賦給 HomeController 的成員變量 $view,這個(gè)變量是從 BaseController 中繼承得來(lái)。

父類 BaseController 中的析構(gòu)函數(shù) __destruct() 將在 function home() 執(zhí)行完成后處理這個(gè)成員變量:extract 出視圖要用到的變量,require 視圖文件,將最終運(yùn)算結(jié)果發(fā)送給瀏覽器,流程結(jié)束。


下一步:利用 Composer 完善自己的 PHP 框架(二)——發(fā)送郵件

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

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

相關(guān)文章

  • 【完結(jié)】利用 Composer 完善自己 PHP 框架(三)——Redis 緩存

    摘要:原文發(fā)表在我的個(gè)人網(wǎng)站利用完善自己的框架三緩存本教程示例代碼見(jiàn)回顧上兩篇文章中我們完成了視圖加載類和郵件發(fā)送類的設(shè)計(jì),完成了兩個(gè)可插拔組件。相比使用文件作為緩存,擁有更高的性能更好地可維護(hù)性和更強(qiáng)大的操作。 原文發(fā)表在我的個(gè)人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(三)——Redis 緩存 本教程示例代碼見(jiàn) https://github.com/johnlui/My...

    icattlecoder 評(píng)論0 收藏0
  • 【完結(jié)】利用 Composer 完善自己 PHP 框架(三)——Redis 緩存

    摘要:原文發(fā)表在我的個(gè)人網(wǎng)站利用完善自己的框架三緩存本教程示例代碼見(jiàn)回顧上兩篇文章中我們完成了視圖加載類和郵件發(fā)送類的設(shè)計(jì),完成了兩個(gè)可插拔組件。相比使用文件作為緩存,擁有更高的性能更好地可維護(hù)性和更強(qiáng)大的操作。 原文發(fā)表在我的個(gè)人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(三)——Redis 緩存 本教程示例代碼見(jiàn) https://github.com/johnlui/My...

    Charlie_Jade 評(píng)論0 收藏0
  • 利用 Composer 完善自己 PHP 框架(二)——發(fā)送郵件

    說(shuō)明 原文發(fā)表在我的個(gè)人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(二)——發(fā)送郵件 本教程示例代碼見(jiàn) https://github.com/johnlui/My-First-Framework-based-on-Composer 回顧 上一篇文章中,我們手工建造了一個(gè)簡(jiǎn)易的視圖加載器,順便引入了錯(cuò)誤處理包,讓我們的 MFFC 框架在 M、V、C 三個(gè)方面都達(dá)到了好用的水平。V...

    crossea 評(píng)論0 收藏0
  • laravel開(kāi)發(fā)擴(kuò)展記錄

    摘要:自動(dòng)代碼擴(kuò)展開(kāi)發(fā)時(shí)遵守的代碼風(fēng)格是項(xiàng)目開(kāi)發(fā)規(guī)范。遵照此規(guī)范,在實(shí)際操作中,有許多重復(fù),接下來(lái)推薦一款專為此規(guī)范量身定制的代碼生成器??梢岳么藬U(kuò)展來(lái)快速構(gòu)建項(xiàng)目原型。后續(xù)還會(huì)為大家?guī)?lái)一些最新的技術(shù)擴(kuò)展。 whoops 錯(cuò)誤提示擴(kuò)展 whoops 是一個(gè)非常優(yōu)秀的 PHP Debug 擴(kuò)展,它能夠使你在開(kāi)發(fā)中快速定位出錯(cuò)的位置。laravel默認(rèn)安裝。showImg(https://s...

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

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

0條評(píng)論

閱讀需要支付1元查看
<