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

資訊專欄INFORMATION COLUMN

Laravel 創(chuàng)建自己的 Facade

K_B_Z / 2741人閱讀

摘要:使用現(xiàn)在,在任何一個控制器,或者路由的回調(diào)函數(shù)中,使用你會發(fā)現(xiàn),已經(jīng)可以好好工作了,參考文章設(shè)計模式九外觀模式結(jié)構(gòu)型服務(wù)容器實例教程深入理解控制反轉(zhuǎn)和依賴注入服務(wù)提供者實例教程創(chuàng)建測試實例

我的博客原文: http://www.qinblog.net/Articl...
前言

laravel 提供了一個靈活的模式,那就是 facade 。框架內(nèi)部的 DB、Auth、File 等功能也有相關(guān)的 facade 實現(xiàn)。那么,該如何寫自己的 facade 呢?

Facade 是什么?

首先,facade 并不是 laravel 獨(dú)有的東西,它就是設(shè)計模式中的外觀模式(Facade)。
當(dāng)然,這里就不長篇大論去討論外觀模式的定義了。這篇文章寫的很不錯 : 設(shè)計模式(九)外觀模式Facade(結(jié)構(gòu)型)。
那么,laravel 的 facade 做了什么?
同樣的, laravel 實現(xiàn)了外觀模式的開關(guān)功能,并且使用魔術(shù)方法 __callstatic 實現(xiàn)了靜態(tài)方式調(diào)用、動態(tài)創(chuàng)建對象的功能。參考 (官方文檔)

當(dāng)然你可能覺得這些概念很抽象,都什么玩意。那么其實簡單的講,laravel 的 facade 就是將某些功能封裝成工具類,而且能以靜態(tài)方式調(diào)用工具類的方法。

建立自己的 facade

首先、以 laravel 5.1 框架,我之前寫過的 Geoip facade 為例,說一下怎么去建立自己的 facade。

下載 geoip 擴(kuò)展

geoip 是一個可以更具 IP 獲取國家、地域、城市信息的 PHP 擴(kuò)展,基于 maxmind 數(shù)據(jù)庫。 github 在此。

首先,為 laravel 添加 geoip 擴(kuò)展。
打開 composer.json,添加 "geoip2/geoip2": "~2.0" 到 require。
項目根目錄運(yùn)行 composer update ( 需要安裝 composer )更新一下,geoip 的依賴和軟件包就被下載到 vendor 文件夾中了。

然后下載 geoip 依賴的數(shù)據(jù)庫,免費(fèi)庫的地址 : GeoLite2

我下載了 GeoLite2 Country 和 GeoLite2 City 庫,放到了 storage/geoipdb 中。

建立 facade。

在 app 目錄下新建 Facades 文件夾,里面新建 Facades/GeoIP/GeoIP.php 和 Facades/GeoIP/Facade/GeoIP.php (建議每個功能新建一個文件夾區(qū)分,比如我這里給 GeoIP 新建一個文件夾,關(guān)于GeoIP 的東西全放到這里)
注意,F(xiàn)acades/GeoIP 下的 GeoIP.php 是你要對 geoip 擴(kuò)展進(jìn)行封裝的類, Facades/GeoIP/Facade 下的 GeoIP.php 是你的 facade,用來給 laravel 解析使用,這兩個文件可以不同名。

目錄結(jié)構(gòu)如圖:

Facades/GeoIP/Facade/GeoIP.php 如下


注意你的 facade 現(xiàn)在只有一個方法,返回了一個字符串 "geoip" , 這個字符串是一個標(biāo)號,用來給 laravel 的服務(wù)提供者解析使用的。

Facades/GeoIP/GeoIP.php 如下(吐槽:寫的有點隨意)

_country_db;
            break;
          case "getCity":
            $path = $this->_city_db;
            break;
          default:
            break;
        }

        $this->_instance = new Reader(storage_path($path));
    }

    /**
     * Get Country infomations.
     *
     * @param  String  $ip
     * @return Array
     */
    public function getCountry($ip)
    {
      $this->init(__FUNCTION__);

      $record = $this->_instance->country($ip);

      // 國家信息
      $data["iso_code"] = $record->country->isoCode;
      $data["country_name"] = $record->country->name;
      $data["country_name_zh_cn"] = $record->country->names["zh-CN"];

      return $data;
    }
 
 /**
     * Get City infomations.
     *
     * @param  String  $ip
     * @return Array
     */
    public function getCity($ip)
    {
      $this->init(__FUNCTION__);

      $record = $this->_instance->city($ip);

      $data["iso_code"] = $record->country->isoCode;
      $data["country_name"] = $record->country->name;
      $data["country_name_zh_cn"] = $record->country->names["zh-CN"];

      // 省、州信息
      $data["sub_division_name"] = $record->mostSpecificSubdivision->name;
      $data["sub_division_name_zh_cn"] = $record->mostSpecificSubdivision->names["zh-CN"];
      $data["sub_division_code"] = $record->mostSpecificSubdivision->isoCode;

      // 城市信息
      $data["city_name"] = $record->city->name;
      $data["postal_code"] = $record->postal->code;

      // 經(jīng)緯度
      $data["latitude"] = $record->location->latitude;
      $data["longitude"] = $record->location->longitude;

      return $data;
    }

}

OK,現(xiàn)在 geoip 的常用功能已經(jīng)封裝到方法中了。

注冊服務(wù)

完成了 facade 的創(chuàng)建和功能封裝,下面就要使用它了。自己創(chuàng)建的 facade 要在 laravel 使用是要進(jìn)行注冊的,以便 laraval 在啟動時能自動注入依賴(請看 laravel 的依賴注入簡介 : laravel 依賴注入 學(xué)院君)

編寫服務(wù)提供者

在 app/Providers 下新建 FacadesServiceProvider.php
可以手動建,也可以用 artisan 命令來生成,隨你喜歡。
app/Providers/FacadesServiceProvider.php 代碼如下:

app->singleton("geoip", function ($app) {
            return new GeoIP($app);
        });
    }
}

上面代碼可知,服務(wù)提供者注冊時會注冊一個單例,標(biāo)號為 "geoip",也就是我們自己的 facade 返回的那個,然后回調(diào)函數(shù)會返回一個對象,也就是我們封裝 geoip 功能的那個類的實例,不明白的同學(xué)可以看看 laravel 的服務(wù)提供者和服務(wù)容器相關(guān)知識哦。(注意要 use 將 facade 和封裝類的命名空間引用一下哦)

注冊服務(wù)提供者

laravel 5.1 以上版本的話, config/app.php 中找到 providers 和 aliases ,將你的服務(wù)提供者和 facade 別名配置一下 :

providers 加入 :

AppProvidersFacadeServiceProvider::class,

aliases 加入(不用每次都寫很長的命名空間前綴) :

"GeoIP"      => AppFacadesGeoIPFacadeGeoIP::class,

對于 lumen 5.2 以上,需要在 bootstrap/app.php 中添加

$app->register(AppProvidersFacadesServiceProvider::class);

注冊完畢后,每次使用 facade::function 的時候,laravel 會自動解析 facade, 然后創(chuàng)建一個對象給用戶使用,,而無需用戶自己去 new 一個對象出來。

使用

現(xiàn)在,在任何一個控制器,或者路由的回調(diào)函數(shù)中,使用

$res = GeoIP::getCountry("75.101.195.215");
var_dump($res);

你會發(fā)現(xiàn),facade 已經(jīng)可以好好工作了,enjoy!

參考文章

【1】設(shè)計模式(九)外觀模式Facade(結(jié)構(gòu)型)
【2】Laravel 服務(wù)容器實例教程 —— 深入理解控制反轉(zhuǎn)(IoC)和依賴注入(DI)
【3】Laravel 服務(wù)提供者實例教程 —— 創(chuàng)建 Service Provider 測試實例

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

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

相關(guān)文章

  • Laravel框架門面Facade源碼分析

    摘要:容器主要的作用就是生產(chǎn)各種零件,就是提供各個服務(wù)。的原理我們以為例,來講解一下門面的原理與實現(xiàn)。當(dāng)運(yùn)行時,發(fā)現(xiàn)門面沒有靜態(tài)函數(shù),就會調(diào)用這個魔術(shù)函數(shù)。我們看到這個魔術(shù)函數(shù)做了兩件事獲得對象實例,利用對象調(diào)用函數(shù)。 前言 在開始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn這篇文章我們開始講 laravel 框架中的門面 Facade,什么是門面呢?官方文檔: Facade...

    wanghui 評論0 收藏0
  • 通過facade(尤其是realtime facade)來使代碼更優(yōu)雅

    摘要:那么如果用的方式會怎么樣呢現(xiàn)在,不僅看起來更簡潔優(yōu)雅,而且也可以測試了,因為可以進(jìn)行,比如說這樣你會發(fā)現(xiàn)最有用的地方就是構(gòu)建簡潔優(yōu)雅的,同時呢又不會影響到代碼的可測試性。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050 該篇翻譯整理自laravel創(chuàng)始人Taylor的文章:Expressive Code & Real ...

    Eric 評論0 收藏0
  • PHP中facade pattern(外觀模式)

    摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群該篇屬于底層核心技術(shù)實戰(zhàn)揭秘這一課程底層核心概念解析這一章的擴(kuò)展閱讀。考慮到學(xué)員們的基礎(chǔ)差異,為了避免視頻當(dāng)中過于詳細(xì)而連篇累牘,故將一些底層實現(xiàn)相關(guān)的知識點以文章形式呈現(xiàn),供大家預(yù)習(xí)和隨時查閱。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050該篇屬于《Laravel底層核心技術(shù)實戰(zhàn)...

    jaysun 評論0 收藏0
  • 深入淺出 Laravel Facade 外觀系統(tǒng)

    摘要:外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。將使用者與子系統(tǒng)從直接耦合,轉(zhuǎn)變成由外觀類提供統(tǒng)一的接口給使用者使用,以降低客戶端與子系統(tǒng)之間的耦合度。接下來將深入分析外觀服務(wù)的加載過程。引導(dǎo)程序?qū)⒃谔幚碚埱笫峭瓿梢龑?dǎo)啟動。 本文首發(fā)于 深入淺出 Laravel 的 Facade 外觀系統(tǒng),轉(zhuǎn)載請注明出處。 今天我們將學(xué)習(xí) Laravel 核心架構(gòu)中的另一個主題「Fac...

    KavenFan 評論0 收藏0
  • Laravel 服務(wù)提供者和門面模式

    摘要:服務(wù)提供者先看看定義服務(wù)提供者是所有應(yīng)用程序啟動的中心所在。通過本文,希望大家能夠了解服務(wù)提供者,,和實際調(diào)用的類的實例之間的關(guān)系。 以 Laravel 自帶的文件系統(tǒng)為例,在 config/app.php 的配置文件的 providers 數(shù)組中,注冊了一個服務(wù)提供者: IlluminateFilesystemFilesystemServiceProvider::class, 在 a...

    e10101 評論0 收藏0

發(fā)表評論

0條評論

K_B_Z

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<