composer require --dev doctrine/doctrine-fixtures-bundle
Create the fixture:
<?php
namespace App\\DataFixtures;
use App\\Entity\\BlogPost;
use Doctrine\\Bundle\\FixturesBundle\\Fixture;
use Doctrine\\Persistence\\ObjectManager;
class AppFixtures extends Fixture
{
private UserPasswordHasherInterface $userPasswordHasher;
public function __construct(UserPasswordHasherInterface $userPasswordHasher)
{
$this->userPasswordHasher = $userPasswordHasher;
}
public function load(ObjectManager $manager): void
{
$this->loadUsers($manager);
$this->loadBlogPosts($manager);
}
public function loadBlogPosts(ObjectManager $manager)
{
/** @var User $user */
$user = $this->getReference('user_admin');
$blogPost = new BlogPost();
$blogPost->setTitle('A first post!');
$blogPost->setPublished(new \\DateTime('2021-11-26 23:30:00'));
$blogPost->setContent('Post text!');
$blogPost->setAuthor($user);
$blogPost->setSlug('a-first-post');
$manager->persist($blogPost);
$blogPost = new BlogPost();
$blogPost->setTitle('A second post!');
$blogPost->setPublished(new \\DateTime('2021-11-26 23:31:00'));
$blogPost->setContent('Post text!');
$blogPost->setAuthor($user);
$blogPost->setSlug('a-second-post');
$manager->persist($blogPost);
$manager->flush();
}
public function loadComments(ObjectManager $manager)
{
}
public function loadUsers(ObjectManager $manager)
{
$user = new User();
$user->setUsername('admin')
->setEmail('[email protected]')
->setName('Bruno Jesus');
$user->setPassword($this->userPasswordHasher->hashPassword(
$user,
'secret123#'
));
$this->addReference('user_admin', $user);
$manager->persist($user);
$manager->flush();
}
}
<aside>
💡 The UserPasswordHasher
hashes password in bcrypt, the User
entity has to implement the PasswordAuthenticatedUserInterface
.
When creating the user we call the addReference
method to later be able to use that object from the loadBlogPosts
method.
</aside>
Execute:
php bin/console doctrine:fixtures:load
Instead of creating our fake data, we can generate it with a faker library.
Installing the library:
composer remove --dev fakerphp/faker
Fixture with faker:
<?php
namespace App\\DataFixtures;
use App\\Entity\\BlogPost;
use App\\Entity\\User;
use Doctrine\\Bundle\\FixturesBundle\\Fixture;
use Doctrine\\Persistence\\ObjectManager;
use Faker\\Factory;
use Faker\\Generator;
use Symfony\\Component\\PasswordHasher\\Hasher\\UserPasswordHasherInterface;
class AppFixtures extends Fixture
{
private UserPasswordHasherInterface $userPasswordHasher;
private Generator $faker;
public function __construct(UserPasswordHasherInterface $userPasswordHasher)
{
$this->userPasswordHasher = $userPasswordHasher;
$this->faker = Factory::create();
}
public function load(ObjectManager $manager): void
{
$this->loadUsers($manager);
$this->loadBlogPosts($manager);
}
public function loadBlogPosts(ObjectManager $manager)
{
/** @var User $user */
$user = $this->getReference('user_admin');
$numberOfPosts = $this->faker->numberBetween(50, 100);
for ($i = 0; $i < $numberOfPosts; $i++) {
$blogPost = new BlogPost();
$blogPost->setTitle($this->faker->realText(30));
$blogPost->setPublished($this->faker->dateTime());
$blogPost->setContent($this->faker->realText());
$blogPost->setAuthor($user);
$blogPost->setSlug($this->faker->slug());
$manager->persist($blogPost);
}
$manager->flush();
}
public function loadComments(ObjectManager $manager)
{
}
public function loadUsers(ObjectManager $manager)
{
$user = new User();
$user->setUsername('admin')
->setEmail('[email protected]')
->setName('Bruno Jesus');
$user->setPassword($this->userPasswordHasher->hashPassword(
$user,
'secret123#'
));
$this->addReference('user_admin', $user);
$manager->persist($user);
$manager->flush();
}
}