如何创建自定义 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
我是 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