使用 Laravel 資料填充功能生成中文測試資料

田勇發表於2017-07-05

今晚……不對,是昨晚,折騰一個的小專案,發現自動填充的中文資料顯示起來總不太美觀,於是開始琢磨如何填充中文資料進行測試。

然而一番搜尋後驚奇的發現,官方、以及一些非官方的文件均未提及這一功能。期間看到一篇他人的“經驗”文章,雖然可以實現這一需求,卻要求修改 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' 就可以實現了

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章