如何在 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 提供程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中实现 vuetify?

如何使用 Laravel 在网站中实现 OCR

如何在 Laravel 网站中实现主题选项?

如何在 laravel 5.1 中实现“记住我”?

如何在 Laravel 关系中实现 SUM()?

如何在 laravel 中实现这个查询?