摘要:是一個(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,address 和 lorem)都被叫做 格式器(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。
getProviderClassnameprotected 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 方法。
getFormatterpublic 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
摘要:今晚不對(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 目...
摘要:開發(fā)原因是一個(gè)非常小的類庫(kù),通過代碼生成來提供高性能的反射處理,自動(dòng)為字段提供訪問類,訪問類使用字節(jié)碼操作而不是的反射技術(shù),因此非???。 開發(fā)原因 Reflec...
摘要:導(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...
摘要:本文首發(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...
摘要:不過除了使用加密,還可以使用原文鏈接使用來調(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...
閱讀 1683·2023-04-26 00:30
閱讀 3155·2021-11-25 09:43
閱讀 2884·2021-11-22 14:56
閱讀 3194·2021-11-04 16:15
閱讀 1155·2021-09-07 09:58
閱讀 2028·2019-08-29 13:14
閱讀 3113·2019-08-29 12:55
閱讀 993·2019-08-29 10:57