我想在Laravel中为Faker创建一个自定义提供程序(例如,一个用于随机构建名称)。
我在哪里将自定义提供程序存储在我的应用程序中以及如何使用它?
答案 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;
} );
}