亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Faker 虛擬數(shù)據(jù)填充和源碼解析

weapon / 2015人閱讀

摘要:是一個虛擬數(shù)據(jù)的生成器,可以用它填充數(shù)據(jù)庫進行壓力測試或者創(chuàng)建優(yōu)雅的文檔。格式器除了以上三個屬性,還提供了大量可供選擇的模擬數(shù)據(jù)。

Faker 是一個虛擬數(shù)據(jù)的生成器,可以用它填充數(shù)據(jù)庫進行壓力測試或者創(chuàng)建優(yōu)雅的 XML 文檔。

安裝

如果項目支持 composer ,使用以下命令安裝。不支持請到 Faker 的 Github 倉庫下載源碼,放入項目的擴展包文件夾中。

composer require fzaninotto/faker

為了演示功能,我使用以下命令創(chuàng)建了一個新項目:

// 創(chuàng)建新項目文件夾
mkdir data-seeder

cd data-seeder
// 安裝 faker 擴展
composer require fzaninotto/faker
基本使用方法

在根目錄下創(chuàng)建測試文件 test.php,輸入以下代碼:

name, "
";
echo $faker->address, "
";
echo $faker->text;

在 CLI 模式下運行腳本, php test.php 查看輸出結(jié)果。faker 的結(jié)果是隨機生成的:

Prof. Kailyn Barton
9230 Herzog Groves Suite 005
Gusikowskihaven, CO 60533-4716
Nesciunt voluptas debitis iusto consectetur possimus mollitia in quam. Vel non rem temporibus illo numquam est. Sit fugit sed fugit id eligendi eaque sunt possimus.
faker 的專有名詞

faker 中定義了一些專有名詞幫助我們理解它的設計思路,明白這些概念對理解他的源碼非常有幫助。

格式器(formatters)

除了以上三個屬性,faker 還提供了大量可供選擇的模擬數(shù)據(jù)。每個生成器屬性(例如上面使用的 name,addresslorem)都被叫做 格式器(formatters)。

提供器(providers)

我們需要填充的數(shù)據(jù)有很多種類,例如

基本的隨機數(shù)據(jù):整數(shù)、浮點數(shù)、字母

隨機的人物信息:姓名、姓、名 等

隨機的號碼:手機號、電話號

Faker 將每種分類定義為 provider,查看 data-seeder/vendor/fzaninotto/faker/src/Faker/Provider 可以看到各種 provider 的類文件,以及分語言包的文件。

源碼解析

faker 擴展包體積雖小,五臟俱全,非常有學習價值。

faker 對象生成

查看 faker 生成器的工廠方法:

const DEFAULT_LOCALE = "en_US";

protected static $defaultProviders = array("Address", "Barcode", "Biased", "Color", "Company", "DateTime", "File", "HtmlLorem", "Image", "Internet", "Lorem", "Miscellaneous", "Payment", "Person", "PhoneNumber", "Text", "UserAgent", "Uuid");

public static function create($locale = self::DEFAULT_LOCALE)
{
    $generator = new Generator();
    foreach (static::$defaultProviders as $provider) {
        $providerClassName = self::getProviderClassname($provider, $locale);
        $generator->addProvider(new $providerClassName($generator));
    }

    return $generator;
}

參數(shù) locale 是語言包,默認為 en_US 美國英語。在 data-seeder/vendor/fzaninotto/faker/src/Faker/Provider 目錄中可以查看所有支持的語言包。

默認的 providers(provider 已經(jīng)在上面提到過),在以上 Provider 目錄中可以一一對應的找到。循環(huán)數(shù)組,將對應的 provider 添加到生成器 $generator。

getProviderClassname
protected static function getProviderClassname($provider, $locale = "")
{
    if ($providerClass = self::findProviderClassname($provider, $locale)) {
        return $providerClass;
    }
    // fallback to default locale
    if ($providerClass = self::findProviderClassname($provider, static::DEFAULT_LOCALE)) {
        return $providerClass;
    }
    // fallback to no locale
    if ($providerClass = self::findProviderClassname($provider)) {
        return $providerClass;
    }
    throw new InvalidArgumentException(sprintf("Unable to find provider "%s" with locale "%s"", $provider, $locale));
}

getProviderClassname 將按照以下邏輯尋找 provider 類,如果不存在于當前文件就到下一級文件查找,找不到就會跑出異常:

用戶傳入的語言包文件夾 -> 默認的en_US語言包文件夾 -> Provider根目錄
addProvider
public function addProvider($provider)
{
    array_unshift($this->providers, $provider);
}

addProvider 就非常簡單了,只是把找到的 provider 加入數(shù)組頭部,數(shù)組存儲在將要返回的 $generator 對象的屬性中。

faker 對象調(diào)用

在使用 faker 返回的對象時,有兩種方式:調(diào)用屬性和調(diào)用方法。這些調(diào)用都會觸發(fā)魔術方法:

public function format($formatter, $arguments = array())
{
    return call_user_func_array($this->getFormatter($formatter), $arguments);
}

public function __get($attribute)
{
    return $this->format($attribute);
}

public function __call($method, $attributes)
{
    return $this->format($method, $attributes);
}

兩者邏輯類似,這里說明相對麻煩一點的 __call 魔術方法,魔術方法會將調(diào)用的方法名和參數(shù)傳入 farmat 方法。

getFormatter
public function getFormatter($formatter)
{
    if (isset($this->formatters[$formatter])) {
        return $this->formatters[$formatter];
    }
    foreach ($this->providers as $provider) {
        if (method_exists($provider, $formatter)) {
            $this->formatters[$formatter] = array($provider, $formatter);

            return $this->formatters[$formatter];
        }
    }
    throw new InvalidArgumentException(sprintf("Unknown formatter "%s"", $formatter));
}

$this->formatters 中存儲的就是 faker 專有名詞那里提到的 formatter(格式器)相關的信息。為了方便理解,這里以獲得數(shù)組中一個隨機元素為例,說明這些抽象的概念。

$faker->randomElement(["a", "b", "c"]);

當調(diào)用此方法時,觸發(fā)魔術方法,然后遍歷每一個 provider 類,查找是否存在此方法。直到在 Base.php 中發(fā)現(xiàn)存在此方法,此時要使用的提供器 provider 為 Base.php,格式器 formatter 就是 randomElement() 方法。

然后就需要將 Base 中存在 randomeElement() 的對應關系存儲起來,避免下次重新遍歷所有 provider,這就是 $this->formatters 實現(xiàn)的原因。

此方法返回對應的 provider 和 formatters 后,通過 call_user_func_array 調(diào)用并返回結(jié)果。

至此,一個完整的 faker 對象生成和調(diào)用的過程就結(jié)束了。

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/30038.html

相關文章

  • 使用 Laravel 數(shù)據(jù)填充功能生成中文測試數(shù)據(jù)

    摘要:今晚不對,是昨晚,折騰一個的小項目,發(fā)現(xiàn)自動填充的中文數(shù)據(jù)顯示起來總不太美觀,于是開始琢磨如何填充中文數(shù)據(jù)進行測試。 今晚……不對,是昨晚,折騰一個的小項目,發(fā)現(xiàn)自動填充的中文數(shù)據(jù)顯示起來總不太美觀,于是開始琢磨如何填充中文數(shù)據(jù)進行測試。 然而一番搜索后驚奇的發(fā)現(xiàn),官方、以及一些非官方的文檔均未提及這一功能。期間看到一篇他人的經(jīng)驗文章,雖然可以實現(xiàn)這一需求,卻要求修改 vendor 目...

    whlong 評論0 收藏0
  • 項目工具:兩行代碼快速生成測試的數(shù)據(jù)的FakeDataMaker

    摘要:開發(fā)原因是一個非常小的類庫,通過代碼生成來提供高性能的反射處理,自動為字段提供訪問類,訪問類使用字節(jié)碼操作而不是的反射技術,因此非???。 開發(fā)原因 Reflec...

    X_AirDu 評論0 收藏0
  • laravel 使用 Faker 數(shù)據(jù)填充

    摘要:導語做開發(fā)的時候,添加測試數(shù)據(jù)是必不可少的,內(nèi)置了很方便的數(shù)據(jù)填充,下面是實例。數(shù)據(jù)填充創(chuàng)建數(shù)據(jù)填充文件創(chuàng)建完成后,我們可以在方法中手動添加幾條測試數(shù)據(jù)??聪驴倲?shù)總數(shù)沒有問題,隨機看十條數(shù)據(jù)數(shù)據(jù)也是正確的。參考資料數(shù)據(jù)填充文檔數(shù)據(jù)庫測試。 導語 做開發(fā)的時候,添加測試數(shù)據(jù)是必不可少的,laravel 內(nèi)置了很方便的數(shù)據(jù)填充,下面是實例。 數(shù)據(jù)遷移 先創(chuàng)建數(shù)據(jù)模型和數(shù)據(jù)遷移 php a...

    hiYoHoo 評論0 收藏0
  • Laravel 中的數(shù)據(jù)遷移數(shù)據(jù)填充

    摘要:本文首發(fā)于作者這是一篇基礎教程,對標文檔中的數(shù)據(jù)遷移和數(shù)據(jù)填充。那么,中的數(shù)據(jù)庫遷移概念,就是用于解決團隊中保證數(shù)據(jù)庫結(jié)構(gòu)一致的方案。和不同,如果多次執(zhí)行就會進行多次數(shù)據(jù)填充。好了,數(shù)據(jù)遷移和數(shù)據(jù)填充的基本操作也就這些了。 showImg(https://segmentfault.com/img/remote/1460000012252769?w=648&h=422); 本文首發(fā)于 h...

    mengera88 評論0 收藏0
  • 使用Tinker來調(diào)試Laravel應用程序的數(shù)據(jù)以及使用Tinker一些總結(jié)

    摘要:不過除了使用加密,還可以使用原文鏈接使用來調(diào)試應用程序的數(shù)據(jù)以及使用一些總結(jié)參考資料參考資料使用來調(diào)試你的參考資料框架填充中文數(shù)據(jù)測試數(shù)據(jù) 使用Tinker來調(diào)試Laravel應用程序的數(shù)據(jù)以及使用Tinker一些總結(jié) [toc] 今天我們將討論如何使用Laravel的一些鮮為人知的功能來快速讀取Laravel應用程序中的數(shù)據(jù)。我們可以使用Laravel的手工內(nèi)置php artisan...

    simon_chen 評論0 收藏0

發(fā)表評論

0條評論

weapon

|高級講師

TA的文章

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