如何创建自定义函数/格式化程序nelmio / alice v.3?

时间:2018-04-02 08:00:52

标签: symfony4 nelmio-alice

我是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';
    }

}

2 个答案:

答案 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