摘要:是一個虛擬數據的生成器,可以用它填充數據庫進行壓力測試或者創建優雅的文檔。格式器除了以上三個屬性,還提供了大量可供選擇的模擬數據。
Faker 是一個虛擬數據的生成器,可以用它填充數據庫進行壓力測試或者創建優雅的 XML 文檔。
安裝如果項目支持 composer ,使用以下命令安裝。不支持請到 Faker 的 Github 倉庫下載源碼,放入項目的擴展包文件夾中。
composer require fzaninotto/faker
為了演示功能,我使用以下命令創建了一個新項目:
// 創建新項目文件夾 mkdir data-seeder cd data-seeder // 安裝 faker 擴展 composer require fzaninotto/faker基本使用方法
在根目錄下創建測試文件 test.php,輸入以下代碼:
name, " "; echo $faker->address, " "; 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 還提供了大量可供選擇的模擬數據。每個生成器屬性(例如上面使用的 name,address 和 lorem)都被叫做 格式器(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。
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 類,如果不存在于當前文件就到下一級文件查找,找不到就會跑出異常:
用戶傳入的語言包文件夾 -> 默認的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 方法。
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 中存儲的就是 faker 專有名詞那里提到的 formatter(格式器)相關的信息。為了方便理解,這里以獲得數組中一個隨機元素為例,說明這些抽象的概念。
$faker->randomElement(["a", "b", "c"]);
當調用此方法時,觸發魔術方法,然后遍歷每一個 provider 類,查找是否存在此方法。直到在 Base.php 中發現存在此方法,此時要使用的提供器 provider 為 Base.php,格式器 formatter 就是 randomElement() 方法。
然后就需要將 Base 中存在 randomeElement() 的對應關系存儲起來,避免下次重新遍歷所有 provider,這就是 $this->formatters 實現的原因。
此方法返回對應的 provider 和 formatters 后,通過 call_user_func_array 調用并返回結果。
至此,一個完整的 faker 對象生成和調用的過程就結束了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30038.html
摘要:今晚不對,是昨晚,折騰一個的小項目,發現自動填充的中文數據顯示起來總不太美觀,于是開始琢磨如何填充中文數據進行測試。 今晚……不對,是昨晚,折騰一個的小項目,發現自動填充的中文數據顯示起來總不太美觀,于是開始琢磨如何填充中文數據進行測試。 然而一番搜索后驚奇的發現,官方、以及一些非官方的文檔均未提及這一功能。期間看到一篇他人的經驗文章,雖然可以實現這一需求,卻要求修改 vendor 目...
摘要:開發原因是一個非常小的類庫,通過代碼生成來提供高性能的反射處理,自動為字段提供訪問類,訪問類使用字節碼操作而不是的反射技術,因此非常快。 開發原因 Reflec...
摘要:導語做開發的時候,添加測試數據是必不可少的,內置了很方便的數據填充,下面是實例。數據填充創建數據填充文件創建完成后,我們可以在方法中手動添加幾條測試數據。看下總數總數沒有問題,隨機看十條數據數據也是正確的。參考資料數據填充文檔數據庫測試。 導語 做開發的時候,添加測試數據是必不可少的,laravel 內置了很方便的數據填充,下面是實例。 數據遷移 先創建數據模型和數據遷移 php a...
摘要:本文首發于作者這是一篇基礎教程,對標文檔中的數據遷移和數據填充。那么,中的數據庫遷移概念,就是用于解決團隊中保證數據庫結構一致的方案。和不同,如果多次執行就會進行多次數據填充。好了,數據遷移和數據填充的基本操作也就這些了。 showImg(https://segmentfault.com/img/remote/1460000012252769?w=648&h=422); 本文首發于 h...
摘要:不過除了使用加密,還可以使用原文鏈接使用來調試應用程序的數據以及使用一些總結參考資料參考資料使用來調試你的參考資料框架填充中文數據測試數據 使用Tinker來調試Laravel應用程序的數據以及使用Tinker一些總結 [toc] 今天我們將討論如何使用Laravel的一些鮮為人知的功能來快速讀取Laravel應用程序中的數據。我們可以使用Laravel的手工內置php artisan...
閱讀 1669·2023-04-26 00:30
閱讀 3147·2021-11-25 09:43
閱讀 2868·2021-11-22 14:56
閱讀 3183·2021-11-04 16:15
閱讀 1137·2021-09-07 09:58
閱讀 2014·2019-08-29 13:14
閱讀 3102·2019-08-29 12:55
閱讀 982·2019-08-29 10:57