Skip to content

Commit 30f4ccd

Browse files
committed
minor #727 Revamped the data fixtures (javiereguiluz)
This PR was squashed before being merged into the master branch (closes #727). Discussion ---------- Revamped the data fixtures After #724 and #725 I realized that our fixtures are not following the modern best practices recommended by DoctrineFixturesBundle ([explained here](https://symfony.com/doc/master/bundles/DoctrineFixturesBundle/index.html)): * Use 1 class to load all fixtures unless you have lots of fixtures. * Make the fixture class extend from Symfony's `Fixture` class instead of the complicated Doctrine's classes. * Inject services in the constructor and rely on autowiring. * etc. Commits ------- adb76fc Revamped the data fixtures
2 parents 3bdaac0 + adb76fc commit 30f4ccd

File tree

7 files changed

+179
-322
lines changed

7 files changed

+179
-322
lines changed

src/DataFixtures/FixturesTrait.php renamed to src/DataFixtures/AppFixtures.php

+163-72
Original file line numberDiff line numberDiff line change
@@ -11,49 +11,131 @@
1111

1212
namespace App\DataFixtures;
1313

14-
/**
15-
* Helper class to create fixtures contents.
16-
*/
17-
trait FixturesTrait
14+
use App\Entity\Comment;
15+
use App\Entity\Post;
16+
use App\Entity\Tag;
17+
use App\Entity\User;
18+
use App\Utils\Slugger;
19+
use Doctrine\Bundle\FixturesBundle\Fixture;
20+
use Doctrine\Common\Persistence\ObjectManager;
21+
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
22+
23+
class AppFixtures extends Fixture
1824
{
19-
private function getPostContent(): string
25+
private $passwordEncoder;
26+
27+
public function __construct(UserPasswordEncoderInterface $passwordEncoder)
2028
{
21-
return <<<'MARKDOWN'
22-
Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor
23-
incididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in
24-
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
25-
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
26-
deserunt mollit anim id est laborum.
29+
$this->passwordEncoder = $passwordEncoder;
30+
}
2731

28-
* Ut enim ad minim veniam
29-
* Quis nostrud exercitation *ullamco laboris*
30-
* Nisi ut aliquip ex ea commodo consequat
32+
public function load(ObjectManager $manager)
33+
{
34+
$this->loadUsers($manager);
35+
$this->loadTags($manager);
36+
$this->loadPosts($manager);
37+
}
3138

32-
Praesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at
33-
nunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.
34-
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
35-
himenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a
36-
luctus dolor.
39+
private function loadUsers(ObjectManager $manager)
40+
{
41+
foreach ($this->getUserData() as [$fullname, $username, $password, $email, $roles]) {
42+
$user = new User();
43+
$user->setFullName($fullname);
44+
$user->setUsername($username);
45+
$user->setPassword($this->passwordEncoder->encodePassword($user, $password));
46+
$user->setEmail($email);
47+
$user->setRoles($roles);
48+
49+
$manager->persist($user);
50+
$this->addReference($username, $user);
51+
}
3752

38-
Integer auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*
39-
ex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.
40-
Praesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque
41-
efficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue
42-
nulla vitae est.
53+
$manager->flush();
54+
}
4355

44-
Ut posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**
45-
sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi
46-
arcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel
47-
ipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed
48-
tincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.
49-
Sed in egestas erat.
56+
private function loadTags(ObjectManager $manager)
57+
{
58+
foreach ($this->getTagData() as $index => $name) {
59+
$tag = new Tag();
60+
$tag->setName($name);
5061

51-
Aliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum
52-
lacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec
53-
congue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam
54-
tempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus
55-
tincidunt, faucibus nisl in, aliquet libero.
56-
MARKDOWN;
62+
$manager->persist($tag);
63+
$this->addReference('tag-'.$name, $tag);
64+
}
65+
66+
$manager->flush();
67+
}
68+
69+
private function loadPosts(ObjectManager $manager)
70+
{
71+
foreach ($this->getPostData() as [$title, $slug, $summary, $content, $publishedAt, $author, $tags]) {
72+
$post = new Post();
73+
$post->setTitle($title);
74+
$post->setSlug($slug);
75+
$post->setSummary($summary);
76+
$post->setContent($content);
77+
$post->setPublishedAt($publishedAt);
78+
$post->setAuthor($author);
79+
$post->addTag(...$tags);
80+
81+
foreach (range(1, 5) as $i) {
82+
$comment = new Comment();
83+
$comment->setAuthor($this->getReference('john_user'));
84+
$comment->setContent($this->getRandomText(random_int(255, 512)));
85+
$comment->setPublishedAt(new \DateTime('now + '.($i).'seconds'));
86+
87+
$post->addComment($comment);
88+
}
89+
90+
$manager->persist($post);
91+
}
92+
93+
$manager->flush();
94+
}
95+
96+
private function getUserData(): array
97+
{
98+
return [
99+
// $userData = [$fullname, $username, $password, $email, $roles];
100+
['Jane Doe', 'jane_admin', 'kitten', '[email protected]', ['ROLE_ADMIN']],
101+
['Tom Doe', 'tom_admin', 'kitten', '[email protected]', ['ROLE_ADMIN']],
102+
['John Doe', 'john_user', 'kitten', '[email protected]', ['ROLE_USER']],
103+
];
104+
}
105+
106+
private function getTagData(): array
107+
{
108+
return [
109+
'lorem',
110+
'ipsum',
111+
'consectetur',
112+
'adipiscing',
113+
'incididunt',
114+
'labore',
115+
'voluptate',
116+
'dolore',
117+
'pariatur',
118+
];
119+
}
120+
121+
private function getPostData()
122+
{
123+
$posts = [];
124+
foreach ($this->getPhrases() as $i => $title) {
125+
// $postData = [$title, $slug, $summary, $content, $publishedAt, $author, $tags, $comments];
126+
$posts[] = [
127+
$title,
128+
Slugger::slugify($title),
129+
$this->getRandomText(),
130+
$this->getPostContent(),
131+
new \DateTime('now - '.$i.'days'),
132+
// Ensure that the first post is written by Jane Doe to simplify tests
133+
$this->getReference(['jane_admin', 'tom_admin'][0 === $i ? 0 : random_int(0, 1)]),
134+
$this->getRandomTags(),
135+
];
136+
}
137+
138+
return $posts;
57139
}
58140

59141
private function getPhrases(): array
@@ -92,55 +174,64 @@ private function getPhrases(): array
92174
];
93175
}
94176

95-
private function getTagNames(): array
96-
{
97-
return [
98-
'lorem',
99-
'ipsum',
100-
'consectetur',
101-
'adipiscing',
102-
'incididunt',
103-
'labore',
104-
'voluptate',
105-
'dolore',
106-
'pariatur',
107-
];
108-
}
109-
110-
private function getRandomPostTitles(): array
177+
private function getRandomText(int $maxLength = 255): string
111178
{
112179
$phrases = $this->getPhrases();
113-
114-
// this ensures that the first title is always 'Lorem Ipsum...'
115-
$loremIpsumPhrase = array_shift($phrases);
116180
shuffle($phrases);
117-
array_unshift($phrases, $loremIpsumPhrase);
118181

119-
return $phrases;
182+
while (mb_strlen($text = implode('. ', $phrases).'.') > $maxLength) {
183+
array_pop($phrases);
184+
}
185+
186+
return $text;
120187
}
121188

122-
private function getRandomPostSummary(int $maxLength = 255): string
189+
private function getPostContent(): string
123190
{
124-
$phrases = $this->getPhrases();
191+
return <<<'MARKDOWN'
192+
Lorem ipsum dolor sit amet consectetur adipisicing elit, sed do eiusmod tempor
193+
incididunt ut labore et **dolore magna aliqua**: Duis aute irure dolor in
194+
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
195+
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
196+
deserunt mollit anim id est laborum.
125197
126-
$numPhrases = random_int(6, 12);
127-
shuffle($phrases);
128-
$phrases = array_slice($phrases, 0, $numPhrases - 1);
198+
* Ut enim ad minim veniam
199+
* Quis nostrud exercitation *ullamco laboris*
200+
* Nisi ut aliquip ex ea commodo consequat
129201
130-
while (mb_strlen($summary = implode('. ', $phrases).'.') > $maxLength) {
131-
array_pop($phrases);
132-
}
202+
Praesent id fermentum lorem. Ut est lorem, fringilla at accumsan nec, euismod at
203+
nunc. Aenean mattis sollicitudin mattis. Nullam pulvinar vestibulum bibendum.
204+
Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
205+
himenaeos. Fusce nulla purus, gravida ac interdum ut, blandit eget ex. Duis a
206+
luctus dolor.
207+
208+
Integer auctor massa maximus nulla scelerisque accumsan. *Aliquam ac malesuada*
209+
ex. Pellentesque tortor magna, vulputate eu vulputate ut, venenatis ac lectus.
210+
Praesent ut lacinia sem. Mauris a lectus eget felis mollis feugiat. Quisque
211+
efficitur, mi ut semper pulvinar, urna urna blandit massa, eget tincidunt augue
212+
nulla vitae est.
133213
134-
return $summary;
214+
Ut posuere aliquet tincidunt. Aliquam erat volutpat. **Class aptent taciti**
215+
sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi
216+
arcu orci, gravida eget aliquam eu, suscipit et ante. Morbi vulputate metus vel
217+
ipsum finibus, ut dapibus massa feugiat. Vestibulum vel lobortis libero. Sed
218+
tincidunt tellus et viverra scelerisque. Pellentesque tincidunt cursus felis.
219+
Sed in egestas erat.
220+
221+
Aliquam pulvinar interdum massa, vel ullamcorper ante consectetur eu. Vestibulum
222+
lacinia ac enim vel placerat. Integer pulvinar magna nec dui malesuada, nec
223+
congue nisl dictum. Donec mollis nisl tortor, at congue erat consequat a. Nam
224+
tempus elit porta, blandit elit vel, viverra lorem. Sed sit amet tellus
225+
tincidunt, faucibus nisl in, aliquet libero.
226+
MARKDOWN;
135227
}
136228

137-
private function getRandomCommentContent(): string
229+
private function getRandomTags(): array
138230
{
139-
$phrases = $this->getPhrases();
140-
141-
$numPhrases = random_int(2, 15);
142-
shuffle($phrases);
231+
$tagNames = $this->getTagData();
232+
shuffle($tagNames);
233+
$selectedTags = array_slice($tagNames, 0, random_int(2, 4));
143234

144-
return implode(' ', array_slice($phrases, 0, $numPhrases - 1));
235+
return array_map(function ($tagName) { return $this->getReference('tag-'.$tagName); }, $selectedTags);
145236
}
146237
}

src/DataFixtures/PostFixtures.php

-117
This file was deleted.

0 commit comments

Comments
 (0)