如何在Laravel中实现自己的Faker提供程序

时间:2016-07-07 16:29:34

标签: php laravel faker laravel-seeding

我想在Laravel中为Faker创建一个自定义提供程序(例如,一个用于随机构建名称)。

我在哪里将自定义提供程序存储在我的应用程序中以及如何使用它?

4 个答案:

答案 0 :(得分:13)

您应该使用php artisan生成自定义提供程序...

在命令行上,导航到应用程序的根目录并键入...

php artisan make:provider FakerServiceProvider

这应该在app/Providers文件夹中生成新的提供程序。以下是我的注册函数在faker文档中的示例。

/**
 * 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< 7,您可能需要使用新的提供程序类创建一个新文件并将其传入。确保您还将此新提供程序添加到providers中的app/config.php数组中。

现在它已经注册,您可以使用以下内容获取新的faker类...

$faker = app('Faker');
echo $faker->title;

此外,如果您浏览https://laravel.com/docs/5.2/facades处的文档,您也应该能够轻松地制作Faker门面。完成所有繁重的工作后,您只需要创建新的外观类,getFacadeAccessor返回'Faker',然后将其添加到facades中的app/config.php数组中。

然后你可以像这样简单地使用它......

echo Faker::title;

答案 1 :(得分:3)

创建自定义提供程序类并将其保存在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,
    ];
});

答案 2 :(得分:2)

最简洁的方法是在 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;
            });
        }
    }
}

答案 3 :(得分:0)

我发现这样做效果更好,因为它不需要使用$faker实例化我的resolve()实例:

public function register ()
    {
        $this->app->bind( Generator::class, function ( $app ) {

            $faker = \Faker\Factory::create();
            $faker->addProvider( new CustomFakerProvider( $faker ) );

            return $faker;
        } );

    }