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__ . '/vendor/fzaninotto/faker/src/autoload.php'; $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 还供应了大批可供挑选的模仿数据。每一个生成器属性(比方上面运用的 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
。
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(花样器)相干的信息。为了轻易邃晓,这里以取得数组中一个随机元素为例,申明这些笼统的观点。
$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
对象生成和挪用的历程就完毕了。
以上就是Faker假造数据添补的细致引见(附示例)的细致内容,更多请关注ki4网别的相干文章!