Récupérer le corps JSON d'une requête en tant que tableau avec Symfony
Publié le 04/12/2021 • Actualisé le 04/12/2021
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);
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');
}
}