DoctrineFixturesBundle

编辑本页

DoctrineFixturesBundle

fixture用于将一组“假”数据加载到数据库中,然后用于测试或在开发应用程序时帮助提供一些有趣的数据。

此包与支持的任何数据库兼容教义ORM(MySQL, PostgreSQL, SQLite等)。如果您正在使用MongoDB,则必须使用DoctrineMongoDBBundle代替。

安装

在Sy欧宝娱乐app下载地址mfony 4或更高的应用程序中使用欧宝娱乐app下载地址Symfony Flex,打开命令控制台,进入您的项目目录,执行以下命令:

1
Composer require——dev orm-fixture

从Symfony 4.0开始欧宝娱乐app下载地址,应该默认使用Flex并为您注册包,在这种情况下,您可以跳到下一节并开始编写fixture。

在Sy欧宝娱乐app下载地址mfony 3应用程序中(或不使用Symfony Flex时),运行另一个命令:

1
编写人员需要—dev doctrine/doctrine-fixture -bundle

您还需要启用这个包。在Sy欧宝娱乐app下载地址mfony 3和更早的应用程序中,更新AppKernel类:

1 2 3 4 5 6 7 8
/ / app / AppKernel.php/ /……/ / registerBundles ()如果(in_array (->getEnvironment (), (“开发”“测试”),真正的)) {/ /……[] =学说\包\ FixturesBundle \ DoctrineFixturesBundle ();}

写作比赛

数据fixture是PHP类,可以在其中创建对象并将它们持久化到数据库中。

假设你想加入一些产品对象到数据库。没问题!创建一个fixture类并开始添加产品:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
/ / src / DataFixtures / AppFixtures.php名称空间应用程序DataFixtures使用应用程序实体产品使用学说FixturesBundle夹具使用学说持久性ObjectManagerAppFixtures扩展夹具公共函数负载(ObjectManager经理//创建20个产品!砰!0<20.+ +) {产品产品();产品->setName (“产品”);产品->setPrice (mt_rand (10One hundred.));经理->persist (产品);}经理->冲洗();}}

加载装置

一旦你的fixture被写入,通过执行下面的命令来加载它们:

1 2
使用ORM时使用#PHP bin/控制台原则:fixture:load

谨慎

默认情况下负载命令清洗数据库,从每个表中删除所有数据。要附加装置的数据,请添加——附加选择。

此命令查找标记为的所有服务doctrine.fixture.orm.如果你在用默认业务配置,实现的任何类ORMFixtureInterface(例如,从夹具)会自动注册到这个标签。

要查看该命令的其他选项,运行:

1
PHP bin/控制台原则:fixture:load——帮助

从fixture访问服务

在某些情况下,您可能需要在fixture类中访问应用程序的服务。没问题!你的fixture类是一个服务,所以你可以使用正常的依赖注入:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/ / src / DataFixtures / AppFixtures.php使用欧宝娱乐app下载地址组件PasswordHasher切肉机UserPasswordHasherInterfaceAppFixtures扩展夹具私人UserPasswordHasherInterface切肉机公共函数__construct(UserPasswordHasherInterface切肉机->切肉机=切肉机;}/ /……公共函数负载(ObjectManager经理用户用户();用户->setUsername (“管理”);密码->切肉机->hashPassword (用户“pass_1234”);用户->向setPassword (密码);经理->persist (用户);经理->冲洗();}}

将fixture拆分为单独的文件

在大多数应用程序中,在一个类中创建所有fixture是可以的。这个类可能会有点长,但它是值得的,因为只有一个文件有助于保持简单。

如果您决定将fixture分割到单独的文件中,Symfony可以帮助您解决两个最常见的问题:在fixture之间共享对象和欧宝娱乐app下载地址按顺序加载fixture。

在fixture之间共享对象

在使用多个fixture文件时,可以跨不同文件重用PHP对象对象引用.使用addReference ()方法为任何对象指定名称,然后使用getReference ()方法通过名称获取完全相同的对象:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src / DataFixtures / UserFixtures.php/ /……UserFixtures扩展夹具公共常量ADMIN_USER_REFERENCE =“admin用户切换”公共函数负载(ObjectManager经理userAdmin用户(“管理”“pass_1234”);经理->persist (userAdmin);经理->冲洗();//其他fixture可以使用UserFixtures::ADMIN_USER_REFERENCE常量来获取该对象->addReference (自我::ADMIN_USER_REFERENCE,userAdmin);}}
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / DataFixtures / GroupFixtures.php/ /……GroupFixtures扩展夹具公共函数负载(ObjectManager经理userGroup集团(“管理员”);//该引用返回UserFixtures中创建的User对象userGroup->addUser (->getReference (UserFixtures::ADMIN_USER_REFERENCE));经理->persist (userGroup);经理->冲洗();}}

使用引用的唯一注意事项是fixture需要按特定顺序加载(在本例中,如果集团夹具在装入前用户fixture,您将看到一个错误)。默认情况下,Doctrine按字母顺序加载fixture文件,但是您可以控制它们的顺序,这将在下一节中解释。

按顺序加载Fixture文件

Doctrine没有定义所有fixture文件必须加载的确切顺序,而是使用了一种更智能的方法来确保一些fixture先于其他fixture加载。实现DependentFixtureInterface并添加一个新的getDependencies ()方法添加到fixture类中。这将返回一个必须在此之前加载的fixture类数组:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/ / src / DataFixtures / UserFixtures.php名称空间应用程序DataFixtures/ /……UserFixtures扩展夹具公共函数负载(ObjectManager经理/ /……}}/ / src / DataFixtures / GroupFixtures.php名称空间应用程序DataFixtures/ /……使用应用程序DataFixturesUserFixtures使用学说常见的DataFixturesDependentFixtureInterfaceGroupFixtures扩展夹具实现了DependentFixtureInterface公共函数负载(ObjectManager经理/ /……公共函数getDependencies()返回[UserFixtures::类);}}

Fixture组:只执行一些Fixture

默认情况下,<新兴市场>所有执行所有的fixture类。如果你只想执行<新兴市场>一些对于fixture类,您可以将它们组织成组。

将fixture类组织到一个组中最简单的方法是使您的fixture实现FixtureGroupInterface

12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / DataFixtures / UserFixtures.php+使用Doctrine\Bundle\FixturesBundle\FixtureGroupInterface;- class UserFixtures扩展Fixture+类UserFixtures扩展Fixture实现FixtureGroupInterface{//…+公共静态函数getGroups():数组+ {+ return ['group1', 'group2'];+}

要执行给定组的所有fixture,请传递——集团选择:

1 2 3 4
PHP bin/控制台原则:fixture:load——group=group1#或执行多个组PHP bin/控制台原则:fixture:load——group=group1——group=group2

或者,不实现FixtureGroupInterface,您还可以为您的服务标记doctrine.fixture.orm再加一个集团选项设置为fixture应归属的组。

无论在fixture或服务定义中定义的组是什么,fixture装入器总是将类的短名称添加为单独的组,这样您就可以一次装入单个fixture。在上面的示例中,可以使用UserFixtures组:

1
php bin/console doctrine:fixtures:load——group=UserFixtures . php bin/console doctrine:fixtures:load——group=UserFixtures

指定清除行为

默认情况下,所有以前存在的数据将使用从表中删除语句。如果你喜欢用截断表语句清洗,使用——purge-with-truncate

如果你想排除一组被清除的表,例如,因为你的模式带有预填充的半静态数据,传递该选项——purge-exclusions.指定——purge-exclusions多次排除多个表。

你也可以定制更多的净化行为,并实现一个自定义的净化器和一个自定义的净化器工厂:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/ / src /清洗用品/ CustomPurger.php名称空间应用程序清洗用品使用学说常见的DataFixtures清洗用品PurgerInterface/ /……CustomPurger实现了PurgerInterface公共函数清洗()无效/ /……}}/ / src /清洗用品/ CustomPurgerFactory.php名称空间应用程序清洗用品/ /……使用学说FixturesBundle清洗用品PurgerFactoryCustomPurgerFactory实现了PurgerFactory公共函数createForEntityManager(?字符串emName, EntityManagerInterface新兴市场数组,被排除在外= [], boolpurgeWithTruncate= false)PurgerInterface返回CustomPurger (新兴市场);}}

下一步是注册自定义除尘器工厂并指定其别名。

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/ services.yaml服务:App \清洗用品\ CustomPurgerFactory:标签:-名称:“doctrine.fixtures.purger_factory”别名:“my_purger”

——泻药选项,我们现在可以指定使用my_purger而不是默认的泻药。

1
PHP bin/控制台原则:fixture:load——purger=my_purger

如何从不同的目录加载fixture

默认情况下,fixture从src / DataFixtures目录中。在这个例子中,我们将从一个新的固定装置目录中。

首先,添加一个newPSR-4的自动加载入口composer.json有了新的固定装置目录:

1 2 3 4 5 6
“autoload-dev”: {“psr-4”: {“…”“…”“DataFixtures \ \”“设备”}},

的依赖项注入固定装置目录:

1 2 3 4 5 6 7 8 9 10 11
/ /配置/ services.php名称空间欧宝娱乐app下载地址组件DependencyInjection加载程序配置器返回函数(ContainerConfigurator容器无效服务容器->服务()->默认值()->自动装配()->可以使用autoconfigure ();服务->负载(“DataFixtures \ \”“. . /装置”);};

谨慎

这将不会覆盖默认值src / DataFixtures使用“Symfony MakerBundle”(欧宝娱乐app下载地址:设备).

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。