如何在 Laravel 中实现自己的 Faker 提供程序
Posted
技术标签:
【中文标题】如何在 Laravel 中实现自己的 Faker 提供程序【英文标题】:How to implement your own Faker provider in Laravel 【发布时间】:2016-11-10 02:02:45 【问题描述】:我想在 Laravel 中为 Faker 创建一个自定义提供程序(例如,一个用于随机建筑物名称的提供程序)。
在我的应用程序中将自定义提供程序存储在哪里以及如何使用它?
【问题讨论】:
【参考方案1】:最简洁的方法是在ServiceProvider
类中调用一个方法来检查是否安装了Faker(它不应该在生产中),然后扩展核心定义。
use Faker\Generator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
public function register()
// other stuff ...
$this->registerFaker();
private function registerFaker()
if (class_exists(Generator::class))
$this->app->extend(Generator::class, function (Generator $generator, $app)
$generator->addProvider(new MyCustomProvider($generator));
return $generator;
);
【讨论】:
【参考方案2】:您应该使用php artisan
来生成自定义提供程序...
在命令行上,导航到应用的根目录并键入...
php artisan make:provider FakerServiceProvider
这应该会在app/Providers
文件夹中生成一个新的提供程序。这是我的 register 函数在 faker docs 中的示例。
/**
* Register the application services.
*
* @return void
*/
public function register()
$this->app->singleton('Faker', function($app)
$faker = \Faker\Factory::create();
$newClass = new class($faker) extends \Faker\Provider\Base
public function title($nbWords = 5)
$sentence = $this->generator->sentence($nbWords);
return substr($sentence, 0, strlen($sentence) - 1);
;
$faker->addProvider($newClass);
return $faker;
);
我在这里使用匿名类。如果您的 php config/app.php 中的 providers
数组中。
现在它已注册,您可以使用以下命令获取新的 faker 类...
$faker = app('Faker');
echo $faker->title;
此外,如果您浏览 https://laravel.com/docs/5.2/facades 的文档,您还应该能够非常轻松地制作 Faker
外观。所有繁重的工作都完成了,您只需要创建新的外观类,让getFacadeAccessor
返回'Faker'
,并将其添加到app/config.php
中的facades
数组中。
那么你就可以像这样简单地使用它了……
echo Faker::title;
【讨论】:
我在工厂有$factory->define(App\User::class, function (Faker\Generator $faker) ...
,所以我将绑定名称更改为Faker\Generator
。
@x-yuri 你能更准确地说明你做了什么吗?我对我的项目有类似的要求
@rap-2-h 据我所知,我可能的意思是,答案中的代码绑定到Faker
类($this->app->singleton('Faker'...
)。但由于我在database/factories
中有Faker\Generator
,我可能会绑定到Faker\Generator
以使用额外的格式化程序(在这种情况下为title
)。
我保留了对Faker
的建议绑定,并在其下方添加了对Faker\Generator
的第二个绑定,它重定向到Faker
。我决定将两个 singleton
声明都保留在 FakerServiceProvider
类中。自定义 Faker 提供者现在在工厂工作,Faker 单例仍然可以通过app('Faker')
访问。抱歉缩小,但这里是代码:$this->app->singleton('Faker\Generator', function($app) return app('Faker'); );
伟大的实施!您如何让您的 IDE 预测和识别这些添加的方法?我正在为 PhpStorm 使用 Laravel IDE,但它们没有被选中。【参考方案3】:
我发现这效果更好,因为它不需要用 resolve()
实例化我的 $faker
实例:
public function register ()
$this->app->bind( Generator::class, function ( $app )
$faker = \Faker\Factory::create();
$faker->addProvider( new CustomFakerProvider( $faker ) );
return $faker;
);
【讨论】:
这对我有用,我刚刚将$this->app->bind(
更改为 $this->app->singleton(
【参考方案4】:
创建您的自定义提供程序类并将其保存在 app/Faker/CustomProvider.php 下。代码:
namespace App\Faker;
use Faker\Provider\Base;
class CustomProvider extends Base
public function customName()
return $this->generator->sentence(rand(2, 6));
然后您只需通过 addProvider 方法将您的自定义提供程序添加到 faker。 laravel 工厂添加自定义提供者示例:
<?php
use Faker\Generator as Faker;
$factory->define(App\Models\Model::class, function(Faker $faker)
$faker->addProvider(new App\Faker\CustomProvider($faker));
return [
'name' => $faker->customName,
];
);
【讨论】:
以上是关于如何在 Laravel 中实现自己的 Faker 提供程序的主要内容,如果未能解决你的问题,请参考以下文章