17

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

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

4

4 回答 4

32

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

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

php artisan make:provider FakerServiceProvider

那应该在app/Providers文件夹中生成一个新的提供程序。这是我的注册函数在 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 < 7,您可能需要使用新的提供程序类创建一个新文件并将其传入。确保您还将这个新提供程序添加到您的providers数组中config/app.php

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

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

此外,如果您浏览https://laravel.com/docs/5.2/facades上的文档,您也应该能够Faker非常轻松地制作外观。所有繁重的工作都完成了,你只需要创建新的外观类,拥有getFacadeAccessorreturn 'Faker',并将它添加到你的facades数组中app/config.php

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

echo Faker::title;
于 2016-07-07T17:16:06.457 回答
9

创建您的自定义提供程序类并将其保存在 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,
    ];
});
于 2018-03-13T10:13:26.210 回答
7

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

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

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

            return $faker;
        } );

    }
于 2018-03-30T13:31:22.423 回答
3

最干净的方法是在一个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;
            });
        }
    }
}
于 2021-04-08T17:14:02.443 回答