HTTP foundation

Symfony et HTTP Foundation

Symfony est une suite de composants qui a pour but de répondre aux besoins des développeurs et de faciliter le développement d’applications web.

En PHP, on peut accéder aux différentes données d’une requête HTTP en utilisant la variable $GLOBALS et ses variables filles : $_GET , $_POST, $_SERVER, $_SERVER, $_FILES, $_ENV, $_SESSION, $_COOKIE

Le problème de l’usage de ces variables, c’est le fait que ça rend le code vite illisible et non-réutilisable.

Symfony a créé une bibliothèque d’objets permettant de manipuler le protocole HTTP de manière propre en offrant une couche d’abstraction. Cette bibliothèque appelée HttpFoundation est au coeur de TOUS les frameworks PHP modernes.


Request

La classe Request est le lien direct avec toutes les variables de $GLOBALS.

Un lien direct est fait avec des classes de type ParameterBag, et ainsi :

PHP $request
$_GET $request->query
$_POST $request->request
$_FILES $request->files
$_COOKIES $request->cookies
$_SERVER $request->server & $request->headers

if(isset($_GET["id"])){
  $id = $_GET["id"];
}else{
  $id = 42;
}
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();
$id = $request->query->get("id",42);
$name = "";
if(isset($_POST["name"])){
  $name = $_POST["name"];
}
$name = $request->request->get("name","");
if(isset($_POST["submit"])){
}
if($request->request->has("submit")){
}

if (isset($_FILES['student_homework'])) {
    $tmpPath = $_FILES['student_homework']['tmp_name'];
    $originalName = $_FILES['student_homework']['name'];
    $ext = pathinfo($originalName, PATHINFO_EXTENSION);
    move_uploaded_file($tmpPath, 'uploads/homework.' . $ext);
}
$file = $request->files->get('student_homework');
if ($file) {
    $ext = $file->guessExtension();
    $file->move('uploads', 'homework.' . $ext);
}

Response

La classe Response est une classe qui permet de réaliser une réponse HTTP tout en évitant de faire des appels aux fonctions header et autres du php.

En pratique :

echo "hello world!";
use \Symfony\Component\HttpFoundation\Response;
$response =new Response("hello world!");
$response->send();

Renvoyer une page d’erreur

header("HTTP/1.0 404 Not Found");
echo "Page not found!";
$response = new Response("Page not found!", Response::HTTP_NOT_FOUND);
$response->send();

Redirection

header("Location: /login");
use \Symfony\Component\HttpFoundation\RedirectResponse;
$response = new RedirectResponse("/login");
$response->send();

Réponse JSON

header('Content-Type: application/json');
echo json_encode(['key' => 'value']);
use \Symfony\Component\HttpFoundation\JsonResponse;
$response = new JsonResponse(["key"=>"value"]);
$response->send();

Téléchargement d’un fichier

header('Content-Description: File Transfer');
header('Content-Type: text/plain');
header('Content-Disposition: inline; filename=file.txt');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filePath));

readfile("file.txt");
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

$response = new BinaryFileResponse("file.txt");
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);

return $response;