sylius/fixtures-bundle
Sylius Fixtures Bundle provides configurable data fixtures for Symfony apps. Define and load structured demo or test data through flexible configuration, ideal for seeding development environments and repeatable setups.
Installation:
composer require sylius/fixtures-bundle
Ensure your config/packages/dev/sylius_fixtures.yaml exists (or create it).
Define Fixtures:
Create a YAML file (e.g., config/fixtures/users.yaml):
App\DataFixtures\ORM\UserFixtures:
resources:
- 'data/users.yml'
Load Fixtures:
php bin/console sylius:fixtures:load
Or load a specific suite:
php bin/console sylius:fixtures:load --suite=users
# Clear existing data (optional)
php bin/console doctrine:database:drop --force
php bin/console doctrine:database:create
# Load fixtures
php bin/console sylius:fixtures:load
Fixtures Classes:
Extend Sylius\Bundle\FixturesBundle\Fixture\AbstractFixture or implement Sylius\Bundle\FixturesBundle\Fixture\FixtureInterface.
Example:
namespace App\DataFixtures\ORM;
use Sylius\Bundle\FixturesBundle\Fixture\AbstractFixture;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\Common\Persistence\ObjectManager;
class UserFixtures extends AbstractFixture
{
public function load(ObjectManager $manager): void
{
$user = new User();
$user->setEmail('test@example.com');
$manager->persist($user);
}
public function getDependencies(): array
{
return [];
}
}
YAML Configuration:
Define fixture suites in config/fixtures/*.yaml:
App\DataFixtures\ORM\UserFixtures:
resources:
- 'data/users.yml'
options:
purge_mode: DELETE_ORPHAN
Dependency Management:
Use getDependencies() to define fixture load order:
public function getDependencies(): array
{
return [ProductFixtures::class];
}
Partial Loading: Load only specific fixtures:
php bin/console sylius:fixtures:load --fixtures=UserFixtures
Environment-Specific Fixtures: Use environment variables to toggle fixture loading:
# config/packages/dev/sylius_fixtures.yaml
sylius_fixtures:
suites:
default:
fixtures:
- App\DataFixtures\ORM\UserFixtures
- App\DataFixtures\ORM\ProductFixtures
Custom Fixture Loaders:
Implement Sylius\Bundle\FixturesBundle\Fixture\Loader\LoaderInterface for custom logic (e.g., API-based fixtures).
Doctrine Events:
Listen to sylius_fixtures.load events for post-load actions:
use Sylius\Bundle\FixturesBundle\Event\FixturesEvent;
public function onFixturesLoaded(FixturesEvent $event): void
{
$this->logger->info('Fixtures loaded!');
}
Symfony Console Commands:
Extend Sylius\Bundle\FixturesBundle\Command\LoadFixturesCommand for custom commands.
Testing: Use fixtures in PHPUnit tests:
use Sylius\Bundle\FixturesBundle\Fixture\Loader\FixturesLoaderInterface;
public function testSomething(FixturesLoaderInterface $loader)
{
$loader->load('default');
// Test logic here
}
Purge Mode Conflicts:
DELETE_ORPHAN may remove unintended data. Use TRUNCATE for a clean slate (but be cautious with foreign keys).php bin/console sylius:fixtures:load --dry-run
Fixture Dependencies:
getDependencies() carefully and validate with:
php bin/console debug:fixtures
Database Transactions:
options:
transaction: false
Verbose Output: Enable debug mode for detailed logs:
php bin/console sylius:fixtures:load -vvv
Fixture Validation: Validate YAML syntax and paths. Use:
php bin/console debug:config sylius_fixtures
Doctrine Events: Ensure your listeners are tagged correctly in services.yaml:
tags:
- { name: kernel.event_listener, event: sylius_fixtures.load, method: onFixturesLoaded }
Reusable Fixtures: Use traits or base classes to avoid duplication:
trait FixtureTrait
{
protected function createUser(string $email): User
{
$user = new User();
$user->setEmail($email);
return $user;
}
}
Environment-Specific Data: Load different fixtures per environment:
# config/packages/test/sylius_fixtures.yaml
sylius_fixtures:
suites:
test:
fixtures:
- App\DataFixtures\ORM\TestUserFixtures
Performance:
$manager->flush();
$manager->clear();
ORDER BY in YAML for predictable loading:
options:
order_by: [id]
Custom Listeners: Extend functionality with listeners (e.g., post-load data transformation):
use Sylius\Bundle\FixturesBundle\Event\FixturesEvent;
use Sylius\Bundle\FixturesBundle\Event\FixturesEvents;
class CustomListener
{
public function onFixturesLoaded(FixturesEvent $event)
{
// Custom logic here
}
}
Register in services.yaml:
services:
App\EventListener\CustomListener:
tags:
- { name: kernel.event_listener, event: sylius_fixtures.load, method: onFixturesLoaded }
Fixtures in Docker: Use entrypoint scripts to load fixtures on container startup:
CMD php bin/console sylius:fixtures:load && php-fpm
Backup Before Loading: Automate backups before fixture loads in CI/CD:
php bin/console doctrine:database:backup
php bin/console sylius:fixtures:load
How can I help you explore Laravel packages today?