成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

weapon / 1935人閱讀

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

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

安裝

如果項(xiàng)目支持 composer ,使用以下命令安裝。不支持請(qǐng)到 Faker 的 Github 倉(cāng)庫(kù)下載源碼,放入項(xiàng)目的擴(kuò)展包文件夾中。

composer require fzaninotto/faker

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

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

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

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

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

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

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 中定義了一些專有名詞幫助我們理解它的設(shè)計(jì)思路,明白這些概念對(duì)理解他的源碼非常有幫助。

格式器(formatters)

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

提供器(providers)

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

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

隨機(jī)的人物信息:姓名、姓、名 等

隨機(jī)的號(hào)碼:手機(jī)號(hào)、電話號(hào)

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

源碼解析

faker 擴(kuò)展包體積雖小,五臟俱全,非常有學(xué)習(xí)價(jià)值。

faker 對(duì)象生成

查看 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 是語言包,默認(rèn)為 en_US 美國(guó)英語。在 data-seeder/vendor/fzaninotto/faker/src/Faker/Provider 目錄中可以查看所有支持的語言包。

默認(rèn)的 providers(provider 已經(jīng)在上面提到過),在以上 Provider 目錄中可以一一對(duì)應(yīng)的找到。循環(huán)數(shù)組,將對(duì)應(yīng)的 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 類,如果不存在于當(dāng)前文件就到下一級(jí)文件查找,找不到就會(huì)跑出異常:

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

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

faker 對(duì)象調(diào)用

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

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);
}

兩者邏輯類似,這里說明相對(duì)麻煩一點(diǎn)的 __call 魔術(shù)方法,魔術(shù)方法會(huì)將調(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 中存儲(chǔ)的就是 faker 專有名詞那里提到的 formatter(格式器)相關(guān)的信息。為了方便理解,這里以獲得數(shù)組中一個(gè)隨機(jī)元素為例,說明這些抽象的概念。

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

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30038.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

0條評(píng)論

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