Important
dot-data-fixtures is a wrapper on top of doctrine/data-fixtures
This package provides a CLI interface for interacting with doctrine/data-fixtures.
Executing fixtures will append data to the tables.
- PHP: 8.2, 8.3 or 8.4
- doctrine/orm: => 3.0
- doctrine/data-fixtures: => 2.0
Run the following command in you project directory
composer require dotkernel/dot-data-fixtures
Next, register the package's ConfigProvider into your application config.
\Dot\DataFixtures\ConfigProvider::class,
In doctrine.global.php
(or your custom doctrine config file) add a new key fixtures
, in the doctrine
array, the value should be a valid path to a folder where your fixtures can be found.
Make sure the path is valid before proceeding to the next step.
return [
'dependencies' => [ ... ],
'doctrine' => [
...,
'fixtures' => getcwd() . '/data/doctrine/fixtures',
],
];
The last step is to register the commands.
We can register the commands to work with the default CLI that doctrine provides us.
Create a new php file bin/doctrine
(if you don't already have this file feel free to copy it from the below example)
<?php
use Doctrine\ORM\Tools\Console\ConsoleRunner;
use Doctrine\ORM\Tools\Console\EntityManagerProvider\SingleManagerProvider;
require_once 'vendor/autoload.php';
$container = require getcwd() . '/config/container.php' ;
$entityManager = $container->get(\Doctrine\ORM\EntityManager::class);
$commands = [
$container->get(Dot\DataFixtures\Command\ExecuteFixturesCommand::class),
$container->get(Dot\DataFixtures\Command\ListFixturesCommand::class),
];
ConsoleRunner::run(
new SingleManagerProvider($entityManager),
$commands
);
List fixtures command - will list all the available fixtures, by order of execution.
php ./bin/doctrine fixtures:list
Execute fixtures command - this command will execute all or one fixture.
To execute all the fixtures run:
php ./bin/doctrine fixtures:execute
To execute a specific fixture run:
php ./bin/doctrine fixtures:execute --class=RoleLoader
When creating a new fixture we have 2 requirements:
- Fixtures should be created in the folder we configured earlier:
data/doctrine/fixtures
- Fixtures should implement
FixtureInterface
and have aload
method. - Create a new php file and copy the below code-block.
<?php
declare(strict_types=1);
namespace Frontend\Fixtures;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Persistence\ObjectManager;
use Frontend\User\Entity\UserRole;
class RoleLoader implements FixtureInterface
{
public function load(ObjectManager $manager): void
{
$adminRole = new UserRole();
$adminRole->setName('admin');
$userRole = new UserRole();
$userRole->setName('user');
$guestRole = new UserRole();
$guestRole->setName('guest');
$manager->persist($adminRole);
$manager->persist($userRole);
$manager->persist($guestRole);
$manager->flush();
}
}
Fixtures can we ordered using 2 methods :
- by order
- by dependencies
Please refer to this link for further details on ordering fixtures: