Récupérer le corps JSON d'une requête en tant que tableau avec Symfony

Publié le 04/12/2021 • Mis à jour le 04/12/2021


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 le corps JSON d'une requête en tant que tableau avec Symfony. Je vois encore des projets qui essaient de décoder le résultat de $request->getContent(), mais on peut utiliser la fonction Request::toArray(). Veuillez noter que si le contenu est vide ou invalide alors, une exception JsonException est levée. Cette fonction a été introduite dans Symfony 5.2.


<?php

declare(strict_types=1);

// src/Controller/Snippet/Snippet177Trait.php

namespace App\Controller\Snippet;

use Symfony\Component\HttpFoundation\Exception\JsonException;
use Symfony\Component\HttpFoundation\Request;

/**
 * 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.
 */
trait Snippet177Trait
{
    public function snippet177(Request $request): void
    {
        // This throws an exception as we access the run snippet page with GET and
        // without JSON request body.
        try {
            $requestAsArray = $request->toArray();
            var_dump(\count($requestAsArray));
        } catch (JsonException $e) {
            echo $e->getMessage()."\n";
        }

        // Now let's create a new request with valid JSON
        $manualRequest = new Request([], [], [], [], [], [], '{"foo":"bar"}');
        echo "\nNew request body is not empty and valid:\n";
        var_dump($manualRequest->toArray());

        // 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 PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Exception\JsonException;
use Symfony\Component\HttpFoundation\Request;

/**
 * @see Snippet177Trait
 */
final class Snippet177Test extends TestCase
{
    /**
     * @see Snippet177Trait::snippet177
     */
    public function testSnippet177(): void
    {
        $request = new Request([], [], [], [], [], [], '');
        $this->expectException(JsonException::class);
        $request->toArray();

        $request = new Request([], [], [], [], [], [], '{"foo": bar}');
        $requestArray = $request->toArray();
        self::assertIsArray($requestArray);
        self::assertSame($requestArray['foor'], 'bar');
    }
}