我是symfony 4的新手,并尝试为yml nelmio / alice编写自己的函数,但是在我运行bin/console doctrine:fixtures:load
之后,我收到了这个错误:
在DeepCopy.php第177行:
“ReflectionClass”类不可复制。
这是我的fixtures.yml文件:
App\Entity\Post:
post_{1..10}:
title: <customFunction()>
这是我的AppFixture.php文件:
<?php
namespace App\DataFixtures;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Nelmio\Alice\Loader\NativeLoader;
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
$loader = new NativeLoader();
$objectSet = $loader->loadFile(__DIR__.'/Fixtures.yml',
[
'providers' => [$this]
]
)->getObjects();
foreach($objectSet as $object) {
$manager->persist($object);
}
$manager->flush();
}
public function customFunction() {
// Some Calculations
return 'Yep! I have got my bonus';
}
}
答案 0 :(得分:3)
在调查了nelmio / alice新版本之后,我找到了解决方案:
我们应该首先创建一个包含新自定义函数的类的提供程序。其次,扩展NativeLoader
类以注册我们的新提供者。第三,使用我们新的NativeLoader(这里是CustomNativeLoader),它允许我们使用我们的新格式化器。
以下是CustomFixtureProvider.php中的提供程序:
<?php
namespace App\DataFixtures;
use Faker\Factory;
class CustomFixtureProvider
{
public function title()
{
$faker = Factory::create();
$title = $faker->text($faker->numberBetween(20,100));
return $title;
}
}
作为旁注,title
函数为您的文章或帖子等生成一些虚拟标题,其动态长度在20..100之间。此函数使用Faker Alice内置格式化程序。
这是CustomNativeLoader.php:
<?php
namespace App\DataFixtures;
use Nelmio\Alice\Faker\Provider\AliceProvider;
use Nelmio\Alice\Loader\NativeLoader;
use Faker\Factory as FakerGeneratorFactory;
use Faker\Generator as FakerGenerator;
class CustomNativeLoader extends NativeLoader
{
protected function createFakerGenerator(): FakerGenerator
{
$generator = FakerGeneratorFactory::create(parent::LOCALE);
$generator->addProvider(new AliceProvider());
$generator->addProvider(new CustomFixtureProvider());
$generator->seed($this->getSeed());
return $generator;
}
}
这是LoadFixture.php:
<?php
namespace App\DataFixtures;
use App\DataFixtures\CustomNativeLoader;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
class LoadFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
$loader = new CustomNativeLoader();
$objectSet = $loader->loadFile(__DIR__ . '/fixtures.yml')->getObjects();
foreach($objectSet as $object) {
$manager->persist($object);
}
$manager->flush();
}
}
最后是使用我们的新title
格式化程序的示例:
App\Entity\Post:
post_{1..10}:
title: <title()>
我知道写一个小函数还有很长的路要走,但根据我的调查,它是在新版本中扩展格式化程序的标准方法。
答案 1 :(得分:0)
您可以通过以下简单方法进行操作:
1。创建自己的提供程序(例如,在/src/DataFixtures/Faker/CustomProvider.php中):
<?php
namespace App\DataFixtures\Faker;
class CustomProvider
{
public static function customFunction()
{
// Some Calculations
return 'Yep! I have got my bonus';
}
}
2。在config / services.yaml中注册提供商:
App\DataFixtures\Faker\CustomProvider:
tags: [ { name: nelmio_alice.faker.provider } ]
就是这样。
P.S。您可以在此处查看更多详细信息:https://github.com/hautelook/AliceBundle/blob/master/doc/faker-providers.md