Récupérer l'IRI d'une entité avec API Platform

Publié le 14/03/2022 • Mis à jour le 14/03/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écupérer l'IRI d'une entité avec API Platform (ainsi que l'inverse !). J'ai ajouté ce snippet, car je n'ai rien trouvé dans la documentation API Platform à ce sujet (et quelqu'un a aussi demandé sur Slack). Le service IriConverter peut être utile, par exemple, si vous voulez envoyer des messages, parce qu'une IRI contient à la fois l'identifiant et le type de ressource à traiter. La fonction inverse getItemFromIri() est quant à elle utile, par exemple, dans un gestionnaire de message, on peut directement récupérer l'entité Doctrine sans se préoccuper du dépôt à utiliser.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use ApiPlatform\Core\Api\IriConverterInterface;
use App\Entity\Article;

/**
 * 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 IriConverterInterface $iriConverter
 */
trait Snippet193Trait
{
    public function snippet193(): void
    {
        $snippet = $this->articleData->getSnippetById(193);
        $snippetIri = $this->iriConverter->getIriFromItem($snippet);
        echo 'IRI: '.$snippetIri;

        unset($snippet);
        echo PHP_EOL;

        /** @var Article $itemFromIri */
        $itemFromIri = $this->iriConverter->getItemFromIri($snippetIri);
        echo 'Snippet: '.$itemFromIri->getSlug().' ('.$itemFromIri->getId().')';

        // 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  Plus sur le web

<?php

declare(strict_types=1);

namespace App\Tests\Integration\Controller\Snippets;

use ApiPlatform\Core\Api\IriConverterInterface;
use App\Data\ArticleData;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
 * @see Snippet193Trait
 */
final class Snippet193Test extends KernelTestCase
{
    private ArticleData $articleData;
    private IriConverterInterface $iriConverter;

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

    /**
     * @see Snippet193Trait::snippet193
     */
    public function testSnippet193(): void
    {
        $snippet = $this->articleData->getSnippetById(193);
        $snippetIri = $this->iriConverter->getIriFromItem($snippet);
        self::assertSame('/api/articles/193', $snippetIri);

        /** @var Article $itemFromIri */
        $itemFromIri = $this->iriConverter->getItemFromIri($snippetIri);
        self::assertSame($snippetIri, $this->iriConverter->getIriFromItem($itemFromIri));
    }
}