使用 Laravel 数据填充功能生成中文测试数据
51

今晚……不对,是昨晚,折腾一个的小项目,发现自动填充的中文数据显示起来总不太美观,于是开始琢磨如何填充中文数据进行测试。

然而一番搜索后惊奇的发现,官方、以及一些非官方的文档均未提及这一功能。期间看到一篇他人的“经验”文章,虽然可以实现这一需求,却要求修改 vendor 目录下 fzaninotto/Faker 包的源码,对于一个中了 Laravel 的“优雅之毒”的人来说,怎能容忍如此风骚的操作?

一定有更好的办法……

继续理清 Laravel 模型工厂原理之后,终于有所进展。发现其实只需要一个小小的修改就可以实现这一功能。

  • 根据官方示例的模型工厂代码
$factory->define(App\Product::class, function (Faker\Generator $faker) {
    return [
        'user_id' => 1,
        'name' => $faker->name,
        'mobile' => $faker->phoneNumber,
        'province' => $faker->state,
        'city' => $faker->city,
        'area' => $faker->area,
        'address' => $faker->streetAddress,
        'postcode' => $faker->postcode,
    ];
});
  • 调整后的代码
$factory->define(App\Address::class, function () {
    $faker = Faker\Factory::create('zh_CN');

    return [
        'user_id' => 1,
        'name' => $faker->name,
        'mobile' => $faker->phoneNumber,
        'province' => $faker->state,
        'city' => $faker->city,
        'area' => $faker->area,
        'address' => $faker->streetAddress,
        'postcode' => $faker->postcode,
    ];
});

调整前,使用依赖注入的 Faker\Generator 是使用的默认语言,即英文。

调整后, Faker\Factory::create('zh_CN') 也会返回一个 Faker\Generator, 但它是使用汉语初始化的。

事实上 Faker 本地化对于中文的支持仍有部分待完善,使用暂时不支持生成随机中文句子或者段落(相应的方法返回的仍然会是英文的),但我相信不久之后会有大牛实现这一些功能。

最后,上图,实际生成数据效果如下:
file

请别纠结省市区从属关系,数据仅供测试而已 :smile:

评论中大牛提醒后发现, Laravel5.4 及更新版本其实已经考虑了这一问题,并设置了相关的配置项 app.faker_locale,只不过在文档和默认的配置文件中看不到这一参数。相关源码在 Illuminate\Database\DatabaseServiceProvider 类中,可以查看源码来判断是否支持这一配置项。对于支持的版本,只需要在 config\app.php 文件中加入 faker_locale => 'zh_CN' 就可以实现了

本帖由 Summer 于 1年前 加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 19
overtrue

不上个生成结果例子看看?

1年前

@overtrue 超哥提醒了我,实际上知道不支持 sentence paragraph 之类的中文,复制例子的时候竟然没注意这个……待我修改下:smile:

1年前

@overtrue 换了个例子,结果截图已上 :laughing:

1年前

@Rekkles :laughing:

1年前
overtrue

@田勇 666

1年前

这个很有用啊。

1年前

@韦林 能对大家开发有所助益,也就没白写。 :smiley:

1年前
Ali

点赞.

1年前

好想只要在config/app.php 文件里面添加'faker_locale' => 'zh_CN',就可以了啊

1年前

@EricShen :+1: 确实是,不过当时没找到这种办法……

1年前

@EricShen 知道当时为毛没找到这个了,写这个的时候测试时用的是5.2版本,那版本里还没有考虑 faker_local 这个配置。

1年前

实际上不用等大牛,faker 接口设计的很漂亮,自己继承实现其 provider 就好。

1年前

@chongyi 道理是这样的,不过对于单元测试都懒得去写的我,也懒得更进一步去折腾了 :smile:

1年前
kylesean

@田勇 中文文本的话,可以在里面内置一大段文本,随机取,TW版本是这么做的,英文用了马尔可夫链算法随机生成的,中文的话估计要配合分词,完了PHP实现该算法。不知道哪个哥们可以实现下,哈哈。

1年前

@kylesean 厉害,没去注意台湾繁体版本的。不过中文博大精深,真要填充数据好看一点儿,挺麻烦的,光个分词断句就够折腾了。

1年前

非常好!

5个月前

如果只是修改地区的话, 在 config 中定义就可以了, https://wujunchao.com/blog/p/1157

3个月前

楼上已经有人回复过了 :+1:

3个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!