Récupérer l'IRI d'une entité avec API Platform
Publié le 14/03/2022 • Actualisé le 14/03/2022
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\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->getIriFromResource($snippet);
echo 'IRI: '.$snippetIri;
unset($snippet);
echo PHP_EOL;
/** @var Article $itemFromIri */
$itemFromIri = $this->iriConverter->getResourceFromIri((string) $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\Api\IriConverterInterface;
use ApiPlatform\Symfony\Routing\IriConverter;
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
{
/** @var ArticleData $articleData */
$articleData = self::getContainer()->get(ArticleData::class);
$this->articleData = $articleData;
/** @var IriConverter $iriConverter */
$iriConverter = self::getContainer()->get(IriConverterInterface::class);
$this->iriConverter = $iriConverter;
}
/**
* @see Snippet193Trait::snippet193
*/
public function testSnippet193(): void
{
$snippet = $this->articleData->getSnippetById(193);
$snippetIri = $this->iriConverter->getIriFromResource($snippet);
self::assertSame('/api/articles/193', $snippetIri);
/** @var Article $itemFromIri */
$itemFromIri = $this->iriConverter->getResourceFromIri($snippetIri);
self::assertSame($snippetIri, $this->iriConverter->getIriFromResource($itemFromIri));
}
}