Réinitialisation d'une entité Doctrine après une modification

Publié le 06/01/2022 • Mis à jour le 06/01/2022


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment réinitialiser une entité Doctrine après une modification. L'astuce est d'utiliser la fonction refresh() du manageur d'entités (c'est en fait un raccourci appelant la fonction de l'objet UnitOfWork). Si vous voulez savoir quels champs de votre entité sont modifiés, veuillez jeter un coup d'œil à ce snippet.


<?php

declare(strict_types=1);

// src/Controller/Snippet/Snippet142Trait.php

namespace App\Controller\Snippet;

use App\Data\ArticleData;
use Doctrine\ORM\EntityManagerInterface;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 *
 * @property ArticleData            $articleData
 * @property EntityManagerInterface $entityManager
 */
trait Snippet183Trait
{
    public function snippet183(): void
    {
        // get the current snippet
        $snippet = $this->articleData->getSnippetById(183);
        echo 'Author before update: '.$snippet->getAuthor().PHP_EOL;

        // modify the author
        $snippet->setAuthor('https://les-tilleuls.coop');
        echo 'Author after update: '.$snippet->getAuthor().PHP_EOL;

        // restore initial state of entity
        $this->entityManager->refresh($snippet);
        // $this->entityManager->getUnitOfWork()->refresh($snippet); // long version

        // we should see the orginial author now!
        echo 'Author after refresh: '.$snippet->getAuthor().PHP_EOL;

        // That's it! 😁
    }
}

 Exécuter le snippet  ≪ this.showUnitTest ? this.trans.hide_unit_test : this.trans.show_unit_test ≫  Plus sur Stackoverflow   Lire la doc  Snippet aléatoire

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use App\Data\ArticleData;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @see Snippet183Trait
 */
final class Snippet183Test extends KernelTestCase
{
    private EntityManagerInterface $entityManager;
    private ArticleData $articleData;

    protected function setUp(): void
    {
        $this->entityManager = self::getContainer()->get(EntityManagerInterface::class);
        $this->articleData = self::getContainer()->get(ArticleData::class);
    }

    /**
     * @see Snippet183Trait::snippet183
     */
    public function testSnippet183(): void
    {
        $originalAuthor = 'COil';
        $snippet = $this->articleData->getSnippetById(183);
        self::assertSame($originalAuthor, $snippet->getAuthor());

        $snippet->setAuthor('https://les-tilleuls.coop');
        self::assertSame('https://les-tilleuls.coop', $snippet->getAuthor());

        $this->entityManager->refresh($snippet);
        self::assertSame($originalAuthor, $snippet->getAuthor());
    }
}