Skip to content

Instantly share code, notes, and snippets.

@jgauthi
Last active February 12, 2024 12:43
Show Gist options
  • Save jgauthi/14787acc1beb90ace2eb2342d732afb2 to your computer and use it in GitHub Desktop.
Save jgauthi/14787acc1beb90ace2eb2342d732afb2 to your computer and use it in GitHub Desktop.
[Symfony] Example of generation of fixture with yaml files (Nelmio Alice)
<?php
// src/DataFixtures/AppFixtures.php
namespace App\DataFixtures;
use App\DataFixtures\ORM\AppNativeLoader;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class AppFixtures extends Fixture
{
public const USER_PASSWORD = 'defaultPasswordForLocalDevelopment';
/**
* Generate data fixtures for local development
* @param ObjectManager $manager
* @throws \Nelmio\Alice\Throwable\LoadingThrowable
*/
public function load(ObjectManager $manager): void
{
$aliceFolder = __DIR__.'/Alice';
$loader = new AppNativeLoader;
$objectSet = $loader->loadFiles([
$aliceFolder.'/Cinema.yaml',
$aliceFolder.'/User.yaml',
$aliceFolder.'/Movie.yaml',
])->getObjects();
foreach($objectSet as $object) {
$manager->persist($object);
}
$manager->flush();
}
}
<?php
// src/DataFixtures/ORM/AppNativeLoader.php
namespace App\DataFixtures\ORM;
use Faker\Factory as FakerGeneratorFactory;
use Faker\Provider\Base as FakerDataProvider;
use Nelmio\Alice\Faker\Provider\AliceProvider;
use Nelmio\Alice\Loader\NativeLoader;
use Faker\Generator as FakerGenerator;
class AppNativeLoader extends NativeLoader
{
public const LOCALE = 'fr_FR';
protected function createFakerGenerator(): FakerGenerator
{
// Localized Fake Data
$generator = FakerGeneratorFactory::create(static::LOCALE);
$generator->addProvider(new AliceProvider);
$generator->seed($this->getSeed());
// Alice: add methods
$generator->addProvider(new FakerDataProvider($generator));
return $generator;
}
}
# src/DataFixtures/Alice/Cinema.yaml
# Create fixture with Alice/Faker library (https://github.com/nelmio/alice), more info on function: https://github.com/fzaninotto/Faker
App\Entity\Cinema:
cinema (template):
title: '<word(3)> Demo'
slug: '<word()>'
host: '<domainName()>'
enabled: true
defaultLang: 'FR'
city: '<city()>'
addressPart1: '<streetAddress()>'
addressPart2: '<secondaryAddress()>'
zipCode: '<postcode()>'
latitude: '<latitude()>'
longitude: '<longitude()>'
email: '<safeEmail()>'
cinema_0 (extends cinema):
user: '@user_0'
title: 'Official cinema'
slug: 'primary'
cinema_1 (extends cinema):
user: '@user_1'
title: 'Secondary cinema without reservation for tests'
slug: 'secondary'
cinema_2 (extends cinema):
user: '@user_2'
title: 'Third cinema with disabled status'
slug: 'third'
enabled: false
# src/DataFixtures/Alice/Movie.yaml
parameters:
# List from http://www.allocine.fr/film/meilleurs/
someMovieNameArray: ['Forrest Gump', 'La Ligne verte', 'Bohemian Rhapsody', 'Green Book : Sur les routes du sud', 'Your Name', 'Coco', 'La Liste de Schindler', '12 hommes en colère', 'Le Parrain', 'Le Seigneur des anneaux : le retour du roi', 'The Dark Knight, Le Chevalier Noir', 'Django Unchained', 'Gran Torino', 'Les Evadés', 'Pulp Fiction', 'Lion', 'Tu ne tueras point', 'Le Seigneur des anneaux : la communauté de l''anneau', 'Le Roi Lion', 'Fight Club', 'Le Seigneur des anneaux : les deux tours', 'Vol au-dessus d''un nid de coucou', 'Gladiator', 'Interstellar', 'Il était une fois en Amérique', 'Star Wars : Episode V - L''Empire contre-attaque', 'Les Enfants Loups, Ame & Yuki', 'Whiplash', 'Seven', 'Le Bon, la brute et le truand']
someFormatArray: ['vosta', 'vf', 'vidéo et 16mm', 'scope 3D numérique', 'scope', 'numérique', 'pano']
someGenreArray: ['Comédie', 'comédie musicale', 'comédie romantique', 'Romance, drame', 'film musical', 'Science fiction, fantastique', 'fantastique', 'court-métrage', 'action', 'documentaire']
someBanArray: ['', 'Tous publics, dès 8 ans', 'Tous publics, dès 5, 6 ans', 'interdit -18 ans', 'Avertissement - de 12 Ans', 'Avertissement : des scènes, des propos ou des imag', 'Des scènes susceptibles de heurter la sensibilité', 'interdit moins 18 ans avec avertissement', 'Déconseillé moins de 14 ans']
someWarningArray: ['', 'Avertissement : des scènes, des propos ou des images peuvent heurter la sensibilité des spectateurs', 'Certaines scènes de ce film sont de nature à choquer un jeune public.', 'Certaines scènes de ce film risquent de heurter un jeune public.', 'Ce film comporte de nombreuses scènes de violence particulièrement cruelles susceptibles de heurter un public sensible.', 'Ce film de genre comprend des scènes d’effroi susceptibles de heurter un public de moins de douze ans.', 'Tous publics avec avertissements pour les personnes sensibles']
App\Entity\Movie:
movie_{1..20}:
title (unique): '<randomElement($someMovieNameArray)>'
originalTitle: '@self->title'
created: '<dateTimeThisYear()>'
modified: '50%? <dateTimeThisMonth()>'
releaseDate: '80%? <dateTimeThisYear()>'
originalReleaseDate: null
orderIndex: '<numberBetween(0, 500)>'
visa: '<randomDigitNotNull()>'
format: '<randomElement($someFormatArray)>'
genre: '<randomElement($someGenreArray)>'
ban: '<randomElement($someBanArray)>'
warning: '<randomElement($someWarningArray)>'
length: '<numberBetween(30, 240)>'
origin: '<country()>'
director: '<name()>'
casting: '<name()>, <name()>, <name()>'
summary: '<realtext(120)>'
distributor: '<company()>'
# src/DataFixtures/Alice/User.yaml
App\Entity\User:
user (template):
plainPassword: !php/const App\DataFixtures\AppFixtures::USER_PASSWORD
enabled: true
user_{0..1} (extends user):
site: '@site_<current()>'
user_2 (extends user):
site: '@site_2'
enabled: false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment