Sharing objects between fixtures
Your models are likely to have relationships with each other. Because of that, it can be interesting to create and persist an object in a fixture, and then reference it in another fixture.
Assuming you have a User
and a Role
model, here is an example
showing how to use the AbstractFixture
class to do that.
|
1 <?php
namespace MyDataFixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Persistence\ObjectManager;
class UserRoleDataLoader extends AbstractFixture
{
public function load(ObjectManager $manager): void
{
$adminRole = new Role();
$adminRole->setName('admin');
$anonymousRole = new Role();
$anonymousRole->setName('anonymous');
$manager->persist($adminRole);
$manager->persist($anonymousRole);
$manager->flush();
// store reference to admin role for User relation to Role
$this->addReference('admin-role', $adminRole);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
And the User
data loading fixture:
1 <?php
namespace MyDataFixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Persistence\ObjectManager;
class UserDataLoader extends AbstractFixture
{
public function load(ObjectManager $manager): void
{
$user = new User();
$user->setUsername('jwage');
$user->setPassword('test');
$user->setRole(
$this->getReference('admin-role', Role::class) // load the stored reference
);
$manager->persist($user);
$manager->flush();
// store reference of admin-user for other Fixtures
$this->addReference('admin-user', $user);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Note that because that last fixture depends on the first one, the order in which fixtures are loading becomes important. You can learn more about how to manage loading order in the dedicated guide.