【问题标题】:How to implement your own Faker provider in Laravel如何在 Laravel 中实现自己的 Faker 提供程序
【发布时间】:2016-11-10 02:02:45
【问题描述】:

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

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

【问题讨论】:

    标签: php laravel faker laravel-seeding


    【解决方案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,
          ];
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 2017-12-07
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多