DoctrineFixturesBundle

版本: 当前的
编辑该页面

DoctrineFixturesBundle

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

此捆绑包与支持的任何数据库兼容教义ORM(MySQL, PostgreSQL, SQLite等)。如果你正在使用MongoDB,你必须使用DoctrineMongoDBBundle相反

安装

在Syob娱乐下载mfony 4或更高级别的应用程序中使用ob娱乐下载Symfony Flex,打开命令控制台,输入您的项目目录,并运行以下命令:

1.
$编写器要求--开发orm装置

从Symfony 4.0开始ob娱乐下载,默认情况下应该使用Flex并为您注册捆绑包,在这种情况下,您可以跳到下一节并开始编写设备。

在Syob娱乐下载mfony 3应用程序中(或不使用Symfony Flex时),请运行以下其他命令:

1.
$编写器要求——dev doctrine/doctrine- fixties -bundle

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

1 2 3 4 5 6 7 8
/ / app / AppKernel.php/ /……/ / registerBundles ()如果(in_数组)($->getEnvironment()[“德夫”,“测试”],符合事实的)) {/ /……$[] =刚出现的条令\Bundle\FixturesBundle\DoctrineFixturesBundle();}

写作比赛

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

假设您想添加一些产品对象。没问题!创建fixtures类并开始添加产品:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
//src/DataFixtures/AppFixtures.php名称空间应用程序\DataFixtures;使用应用程序\实体\产品;使用教条\\FixturesBundle\固定装置;使用教条\坚持不懈\ObjectManager;附件扩展固定装置{公共作用负载(对象管理器)$经理){//创建20个产品!砰!对于($=0;$<20.;$+ +) {$产品=刚出现的产品();$产品->集合名(“产品”$);$产品->setPrice (mt_rand (10,100));$经理->persist ($产品); }$经理->flush();}

装载夹具

写入装置后,通过执行以下命令加载装置:

1 2
#使用ORM时$php bin /控制台学说:夹具:负载

谨慎

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

此命令查找标记为的所有服务条令.如果您使用的是默认服务配置,任何实现OrmFixture接口(例如,从固定装置)将自动注册此标签。

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

1.
$php bin/控制台原则:fixture:load--帮助

从设备访问服务

在某些情况下,您可能需要在fixtures类中访问应用程序的服务。没问题!fixtures类是服务,因此您可以使用普通的依赖项注入:

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使用ob娱乐下载\组成部分\安全\核心\编码器\UserPasswordEncoderInterface;附件扩展固定装置{私有的$编码器;公共作用__构造(UserPasswordEncoderInterface$编码器){$->编码器=$编码器; }/ /……公共作用负载(对象管理器)$经理){$用户=刚出现的用户();$用户->setUsername (“管理”);$暗语=$->编码器->encodePassword ($用户,“pass_1234”);$用户->向setPassword ($暗语);$经理->persist ($用户);$经理->flush();}

将fixture分割到单独的文件中

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

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

在设备之间共享对象

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

1 2 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
//src/DataFixtures/UserFixtures.php/ /……用户装置扩展固定装置{公共常量管理员\用户\参考=“管理员用户”;公共作用负载(对象管理器)$经理){$用户管理员=刚出现的使用者(“管理”,“pass_1234”);$经理->persist ($用户管理员);$经理->冲洗();//其他装置可以使用UserFixtures::ADMIN\u USER\u引用常量获取此对象$->添加引用(自我::ADMIN_USER_REFERENCE,$用户管理员); } }//src/DataFixtures/GroupFixtures.php/ /……团体固定装置扩展固定装置{公共作用负载(对象管理器)$经理){$userGroup=刚出现的团体(“管理员”);//这个引用返回在UserFixtures中创建的User对象$userGroup->地址用户($->getReference(UserFixtures)::管理员(用户(参考));$经理->persist ($userGroup);$经理->flush();}

使用引用的唯一警告是fixture需要按一定的顺序加载(在本例中,如果集团固定装置加载前用户fixture,您将看到一个错误)。默认情况下,Doctrine按照字母顺序加载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;/ /……用户装置扩展固定装置{公共作用负载(对象管理器)$经理){/ /……} }//src/DataFixtures/GroupFixtures.php名称空间应用程序\DataFixtures;/ /……使用应用程序\DataFixtures\用户装置;使用教条\常见的\DataFixtures\DependentFixtureInterface;团体固定装置扩展固定装置实现了DependentFixtureInterface{公共作用负载(对象管理器)$经理){/ /……}公共作用getDependencies(){回来[UserFixtures::类);} }

Fixture组:只执行一些Fixture

默认情况下,<相对长度单位>全部的如果您只想执行<相对长度单位>一些对于fixture类,可以将它们组织成组。

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14
//src/DataFixtures/UserFixtures.php+使用条令\Bundle\FixturesBundle\FixtureGroupInterface;-类UserFixtures扩展Fixture类UserFixtures扩展了Fixture实现了FixtureGroupInterface{/ /……+ public static function getGroups()+ {+ return ['group1', 'group2'];+ }}

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

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

或者,不实施FixtureGroupInterface,您还可以使用条令然后添加一个额外的集团选项设置为fixture应该属于的组。

不管在设备或服务定义中定义了哪些组,设备加载器总是将类的简短名称作为单独的组添加,以便您可以一次加载单个设备。在上面的示例中,可以使用用户装置组:

1.
$php bin/控制台原则:fixtures:load--group=UserFixtures

指定清除行为

默认情况下,使用从表中删除语句。如果您喜欢使用截断表用于清除的语句,请使用--用截断法清除

如果您想要排除一组表被清除,例如,因为您的模式带有预填充的半静态数据,请传递此选项--清除排除具体说明--清除排除多次以排除多个表。

您还可以进一步自定义清除行为,并实现自定义清除器和自定义清除器工厂:

1 2 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/Purger/CustomPurger.php名称空间应用程序\清洗用品;使用教条\常见的\DataFixtures\清洗用品\PurgerInterface;/ /……CustomPurger实现了PurgerInterface{公共作用清洗():无效的{/ /……} }//src/Purger/CustomPurgerFactory.php名称空间应用程序\清洗用品;/ /……使用教条\\FixturesBundle\清洗用品\PurgerFactory;CustomPurgerFactory实现了PurgerFactory{公共作用createForEntityManager(?字符串)$埃姆纳姆, EntityManagerInterface$相对长度单位数组,$被排除在外=[],保龄球$purgeWithTruncate=假):PurgerInterface{回来刚出现的顾客采购员($相对长度单位); } }

下一步是注册我们的定制purger工厂并指定其别名。

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/ services.yaml服务:App\Purger\CustomPurgerFactory:标签:-{姓名:“条令、固定装置、purger_工厂”,别名:“my_purger”}

--呼噜声选项,我们现在可以指定使用my_purger而不是默认的呼噜声。

1.
$php bin/console原则:fixture:load--purger=my_purger