基础用法

使用 `Faker\Factory::create()` 创建并初始化一个假数据生成器,然后就可用通过该对象不同的属性来生产不同类型的假数据。


// 使用工厂模式生成 Faker\Generator 实例
$faker = Faker\Factory::create();

// 通过属性获取假数据
echo $faker->name;
  // 'Lucy Cechtelar';
echo $faker->address;
  // "426 Jordy Lodge
  // Cartwrightshire, SC 88120-6700"
echo $faker->text;
  // Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi
  // beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt
  // amet quidem. Iusto deleniti cum autem ad quia aperiam.
  // A consectetur quos aliquam. In iste aliquid et aut similique suscipit. Consequatur qui
  // quaerat iste minus hic expedita. Consequuntur error magni et laboriosam. Aut aspernatur
  // voluptatem sit aliquam. Dolores voluptatum est.
  // Aut molestias et maxime. Fugit autem facilis quos vero. Eius quibusdam possimus est.
  // Ea quaerat et quisquam. Deleniti sunt quam. Adipisci consequatur id in occaecati.
  // Et sint et. Ut ducimus quod nemo ab voluptatum.

在测试里使用

在命令行应用里定义 tests 别名。比如,在 basic 为模板的项目里,别名应该加在 console.php 配置文件中: Yii::setAlias('tests', __DIR__ . '/../tests'); 在使用这个命令前,你需要对 Faker 库有所了解(阅读手册),比如怎么通过给定的格式生成fixture模板文件。

// users.php 在模板目录里 (默认在 @tests/unit/templates/fixtures)
/**
 * @var $faker \Faker\Generator
 * @var $index integer
 */
return [
    'name' => $faker->firstName,
    'phone' => $faker->phoneNumber,
    'city' => $faker->city,
    'password' => Yii::$app->getSecurity()->generatePasswordHash('password_' . $index),
    'auth_key' => Yii::$app->getSecurity()->generateRandomString(),
    'intro' => $faker->sentence(7, true),  // generate a sentence with 7 words
];

正如你看到的,模板文件只是普通的PHP脚本,模板脚本应该返回包含一组键值对的数组,键代表表中的字段名,值代表假数据值。 当你运行 fixture/generate 命令,每一条假数据都会执行一次模板中定义的假数据生成格式。在模板中你有两个预定义变量可以使用。

  • $faker: 假数据生成器实例
  • $index: 当前假数据的索引。比如你要为user表生成3个假数据,索引将是 0,1,2。

有了模板文件,就可以通过下面的命令生成假数据了:

# 通过users的假数据模板生成假数据
php yii fixture/generate users

# 通过假数据模板同时生成多张表的假数据
php yii fixture/generate users profiles teams

在上面的代码中 users 是假数据模板的模板名称。运行上面的命令后,假数据会在假数据目录中生成 (默认在 @tests/unit/fixtures 文件夹)。

php yii fixture/generate-all

上面这个命令将会扫描模板目录下存放的所有模板并生成假数据,通过 --count 参数指定你想要生成多少行假数据。下面的命令将会使用所有的假数据 模板,每一个模板生成3条假数据。

php yii fixture/generate-all --count=3

使用不同的参数运行命令

# 生成俄语的假数据
php yii fixture/generate users --count=5 --language='ru_RU'

# 从其它文件夹读取模板
php yii fixture/generate-all --templatePath='@app/path/to/my/custom/templates'

# 生成假数据到其它目录
php yii fixture/generate-all --fixtureDataPath='@tests/acceptance/fixtures/data'

运行下面的命令查看所有可用的模板

# 列出默认模板目录的所有模板(默认使用 '@tests/unit/templates/fixtures' 目录)
php yii fixture/templates

# 列出指定目录下可用的模板
php yii fixture/templates --templatePath='@app/path/to/my/custom/templates'

你可以为表的字段创建自己的数据生成策略,参见 Faker 手册获取更多的信息; 你创建的数据生成策略大概像下面这个样子:

class Book extends \Faker\Provider\Base
{

    public function title($nbWords = 5)
    {
        $sentence = $this->generator->sentence($nbWords);
        return mb_substr($sentence, 0, mb_strlen($sentence) - 1);
    }

 }

在 console.php 配置文件中的 $providers 属性里加上你自己的数据生成策略提供器:

'controllerMap' => [
    'fixture' => [
        'class' => 'yii\faker\FixtureController',
        'providers' => [
            'app\tests\unit\faker\providers\Book',
        ],
    ],
]