如何创建自定义 function/formatter nelmio/alice v.3?

How to create custom function/formatter nelmio/alice v.3?

我是 symfony 4 的新手并尝试为 yml nelmio/alice 编写我自己的函数,但是在我 运行 bin/console doctrine:fixtures:load 之后,我得到了这个错误:

In DeepCopy.php line 177:

The class "ReflectionClass" is not cloneable.

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

}

在调查了 nelmio/alice 新版本后,我找到了解决方案:

我们应该首先创建一个 class 提供程序,其中包含我们的新自定义函数。其次,扩展 NativeLoader class 以注册我们的新提供商。第三,使用我们新的 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 built-in 格式化程序。

这里是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.Create 您自己的提供商(例如,在 /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.Register 供应商在 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