Laravel 数据填充国内手机号码、地址等

使用数据填充器让laravel的测试变的方便,我们经常要添加国内的手机号码等,通过查看源码发现,有 Address, Color, Company, DateTime, Internet, Payment, Person, PhoneNumber 这些本地化Provider 可以支持中文。

用法如下:

$factory->define(\App\Admin::class, function (Faker $faker) {
    return [
        'address' =>$faker->address,
        'color' => $faker->colorName,
        'company' => $faker->company,
        'date_time' =>$faker->dateTime,
        'email' => $faker->email,
        'payment' => $faker->bank(),
        'username' => $faker->userName,
        'name' => $faker->name,
        'first_name' => $faker->firstName,
        'mobile'   => $faker->phoneNumber,
    ];
});
Illuminate\Database\Eloquent\Collection {#3137
     all: [
       App\Admin {#3133
         address: "西安高新开发区",
         color: "天青石蓝",
         company: "太极传媒有限公司",
         date_time: DateTime @718532579 {#3131
           date: 1992-10-08 16:22:59.0 Asia/Shanghai (+08:00),
         },
         email: "qvoluptates@sina.com",
         payment: "中国民生银行",
         username: "aperiam_error",
         name: "苟军",
         first_name: "颖",
         mobile: "13061754492",
       },
     ],
   }

其中Person会获取中文姓名和username的格式, Internet会影响获取email时的数据。

在laravel中默认使用en_USProvider ,但是在 DatabaseServiceProvicer 中通过获取配置信息可以指定加载的Locale

    protected function registerEloquentFactory()
    {
        $this->app->singleton(FakerGenerator::class, function ($app) {
            return FakerFactory::create($app['config']->get('app.faker_locale', 'en_US'));
        });

        $this->app->singleton(EloquentFactory::class, function ($app) {
            return EloquentFactory::construct(
                $app->make(FakerGenerator::class), $this->app->databasePath('factories')
            );
        });
    }

所以我们只需要在config/app.php 添加 'faker_locale' => 'zh_CN', 即可。

本作品采用《CC 协议》,转载必须注明作者和本文链接
打酱油
本帖由系统于 5年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7
qiuyuhome

这个赞, 填充数据的时候, 手机号码我一直是使用的正则. 我又 out 了.

5年前 评论
qiuyuhome

感觉类似于这样的文章, 应该放在 wiki 里更合适.

5年前 评论
qiuyuhome

数据有误, Laravel 5.5 经测试, 正确的使用与文中不一致.

<?php

use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

/** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(App\Article::class, function (Faker $faker) {
    $arr = [
        $faker->phoneNumber,
        $faker->colorName,
        $faker->address,
        $faker->company,
        $faker->internetExplorer,

        // 下面这 4 个不能使用, 会报错.
        // $faker->DataTime,
        // $faker->Internet,
        // $faker->Person,
        // $faker->Payment,
    ];
    $content = implode(' ', $arr);

    return [
        'title' => $faker->sentence,
        'content' => $content,
        'status' => $faker->boolean(),
    ];
});

报错信息:

In Generator.php line 242:

  Unknown formatter "DataTime"  
// 其他注释的类似这样的报错.

生成的数据如下:

file

5年前 评论

@qiuyuhome 多谢指出问题,原来不是都是通过属性调用的,不同的provider会影响部分方法和属性获取,我更新了下文章~将调取方法列出来了

5年前 评论

@qiuyuhome 话说怎么发到WIKI里面 - -,

5年前 评论
qiuyuhome

@sureyee 我也不知道. 🤪

5年前 评论

laravel 官方文档里面的数据填充有介绍过~

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!