web-dev-qa-db-ja.com

Laravel)で独自のFakerプロバイダーを実装する方法

Laravel(たとえば、ランダムな建物名用のプロバイダー)でFakerのカスタムプロバイダーを作成したいと思います。

カスタムプロバイダーをアプリケーションのどこに保存し、どのように使用しますか?

13
carte

カスタムプロバイダーを生成するには、php artisanを使用する必要があります...

コマンドラインで、アプリのルートに移動して「...」と入力します。

php artisan make:provider FakerServiceProvider

これにより、app/Providersフォルダーに新しいプロバイダーが生成されます。これが私の登録関数が偽物のドキュメントの例から外れるように見えるものです。

/**
 * 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の場合は、新しいプロバイダークラスを使用して新しいファイルを作成し、それを渡す必要があります。この新しいプロバイダーも、app/config.phpproviders配列に追加してください。

登録されたので、次を使用して新しい偽造クラスを取得できます...

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

さらに、 https://laravel.com/docs/5.2/facades のドキュメントに目を通すと、Fakerファサードを非常に簡単に作成できるはずです。面倒な作業はすべて完了しました。新しいファサードクラスを作成し、getFacadeAccessor'Faker'を返し、それをapp/config.phpfacades配列に追加するだけです。

その後、あなたはそれをそのように簡単に使うことができます...

echo Faker::title;
15
user1669496

カスタムプロバイダークラスを作成し、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メソッドを使用してカスタムプロバイダーをフェイカーに追加する必要があります。カスタムプロバイダーを追加した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,
    ];
});
6
user580485

_$faker_インスタンスをresolve()でインスタンス化する必要がなかったため、これがより適切に機能することがわかりました。

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

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

            return $faker;
        } );

    }
_
1
Stuart Steedman