首頁  >  文章  >  後端開發  >  Faker虛擬資料填充的詳細介紹(附範例)

Faker虛擬資料填充的詳細介紹(附範例)

不言
不言轉載
2019-01-29 11:19:223962瀏覽

這篇文章帶給大家的內容是關於小程式開發之新頁面連結開啟的方法(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

Faker 是一個虛擬資料的產生器,可以用它填充資料庫進行壓力測試或建立優雅的 XML 文件。

安裝

如果專案支援 composer ,使用下列指令安裝。不支援請到 Faker 的 Github 倉庫下載源碼,放入專案的擴充包資料夾中。

composer require fzaninotto/faker

為了示範功能,我使用以下命令建立了一個新專案:

// 创建新项目文件夹
mkdir data-seeder

cd data-seeder
// 安装 faker 扩展
composer require fzaninotto/faker

基本上使用方法

##在根目錄下建立測試文件test.php,輸入以下程式碼:

<?php
require_once __DIR__ . &#39;/vendor/fzaninotto/faker/src/autoload.php&#39;;
$faker = Faker\Factory::create();
echo $faker->name, "\n";
echo $faker->address, "\n";
echo $faker->text;
在CLI 模式下執行腳本,

php test.php 查看輸出結果。 faker 的結果是隨機產生的:

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 還提供了大量可供選擇的模擬資料。每個生成器屬性(例如上面使用的

nameaddresslorem)都被稱為 格式器(formatters)。

提供器(providers)

我們需要填充的資料有很多種類,例如

  • 基本的隨機資料:整數、浮點數、字母

  • 隨機的人物資訊:姓名、姓氏、名稱等

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

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

參數

locale

是語言包,預設為en_US 美國英語。在 data-seeder/vendor/fzaninotto/faker/src/Faker/Provider 目錄中可以查看所有支援的語言套件。 預設的 providers(provider 已經在上面提到過),在上述 Provider 目錄中可以一一對應的找到。循環數組,將對應的 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 加入陣列頭部,陣列儲存在將要傳回的

$generator

物件的屬性中。 faker 物件呼叫

在使用 faker 傳回的物件時,有兩種方式:呼叫屬性和呼叫方法。這些呼叫都會觸發魔術方法:

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

魔術方法,魔術方法會將呼叫的方法名稱和參數傳入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(格式)相關的資訊。為了方便理解,這裡以獲得數組中一個隨機元素為例,說明這些抽象的概念。 <pre class="brush:php;toolbar:false">$faker-&gt;randomElement(['a', 'b', 'c']);</pre>當呼叫此方法時,觸發魔術方法,然後遍歷每一個 provider 類,尋找是否存在此方法。直到在

Base.php

中發現有此方法,此時要使用的提供器provider 為Base.php,格式器formatter 就是randomElement() 方法。 然後就需要將 Base 中存在 randomeElement() 的對應關係儲存起來,避免下次重新遍歷所有 provider,這就是

$this->formatters

實現的原因。 此方法傳回對應的 provider 和 formatters 後,透過

call_user_func_array

呼叫並傳回結果。 至此,一個完整的

faker

物件產生和呼叫的過程就結束了。

以上是Faker虛擬資料填充的詳細介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除