Un bon bundle pour vos fixtures en yaml

Publié le 10/10/2019
Un bon bundle pour vos fixtures en yaml

Vous voulez ajouter des données dans votre application pour bien tester le rendu du contenu?

Bien sur il existe le très bon bundle de Doctrine, et un autre, un peu moins connu, Nelmio Alice.
L'avantage de ce dernier est que les fixtures sont crées à l'aide de fichiers yaml, ce qui est très, très pratique !

Pour installer ce bundle, c'est très simple, utilisez composer :

composer require --dev hautelook/alice-bundle

Le paramètre --dev permet de ne l'installer que pour le mode dev de Symfony. Cela permet d'éviter une mauvaise manipulation en prod ;)

La doc est plutôt explicite, allez voir sur https://github.com/hautelook/AliceBundle

Voici un exemple de fixture permettant d'ajouter des utilisateurs. La subtilité dans ce cas est de saisir un mot de passe en plein texte, et ensuite de passer par un processeur pour encoder automatiquement vos mots de passe.

La fixture (placée dans le répertoire fixtures :
App\Entity\User:
  ebatarson:
    firstName:  John
    lastName:   DOE
    email:      'john.doe@my-domain.fr'
    plainPassword: aVerySolidPassword
    roles:      ['ROLE_ADMIN']

Le champ plainPassword est un champ de l'entité, non mappé avec la base de données (pas d'annonation @ORM), qui nous sert juste ponctuellment pour cet usage.

Le processeur :

<?php

namespace App\DataFixtures\Processor;

use App\Entity\User;
use Fidry\AliceDataFixtures\ProcessorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class UserProcessor implements ProcessorInterface
{
    /**
     * @var UserPasswordEncoderInterface
     */
    private $passwordEncoder;

    public function __construct(UserPasswordEncoderInterface $passwordEncoder)
    {
        $this->passwordEncoder = $passwordEncoder;
    }

    /**
     * Processes an object before it is persisted to DB.
     *
     * @param string $id Fixture ID
     * @param object $object
     */
    public function preProcess(string $id, $object): void
    {
        if (false === $object instanceof User) {
            return;
        }

        /** @var User $object */
        $object->setPassword($this->passwordEncoder->encodePassword($object, $object->getPlainPassword()));
    }

    /**
     * Processes an object after it is persisted to DB.
     *
     * @param string $id Fixture ID
     * @param object $object
     */
    public function postProcess(string $id, $object): void
    {
        // TODO: Implement postProcess() method.
    }
}

Il faut déclarer ce processeur dans votre services.yaml :

App\DataFixtures\Processor\UserProcessor:
    arguments:
        - '@security.user_password_encoder.generic'
    tags: [ { name: fidry_alice_data_fixtures.processor } ]

Et ensuite, lancer la commande :

./bin/console hautelook:fixtures:load

Et vos fixtures sont importées ;)

Commentaires
Un grand merci pour cet article qui me sauve d'heures de recherches !
Ajoutez votre commentaire