Ola mensen,

In het verleden ben ik in een framework (of in Joomla... ik weet niet meer precies waar) wel eens een request en een response object tegengekomen. Ik heb toen niet de tijd gehad om me daarin te verdiepen, maar ik vraag me af wat deze objecten precies doen, en wat voor informatie erin zit.

Iemand die dit kan verduidelijken?

Groeten Ozzie
[offtopic]Daar kom ik weer met Symfony, maar goed het is niet anders...[/offtopic]

Die zitten in Symfony2 (en 1), over het algemeen in elke HTTP framework. Wat er gebeurd in de front controller is dit:
<?php
$request = Request::createFromGlobals();
?>
Daarmee wordt de factory aangeroepen die een Request object gaat aanmaken aan de hand van de data van de gebruiker. Hierin zitten bijv. alle parameters (post en get), sessies, cookies, headers, $_SERVER dingen, ect. Die kun je allemaal opvragen:
<?php
$request->request->get('foo'); // $_POST['foo']
$request->query->get('bar'); // $_GET['bar']
// ...
?>
Een Request object bevat dus alle gegevens van de HTTP request en dus die van de Gebruiker

Vervolgens wordt deze in een Controller gestopt. Deze Controller heeft als doel van die Request een Response te maken. Een Response object bevat alle data die wordt teruggegeven aan de browser. Het gaat dan vaak voornamelijk om de content.

In een controller doe je bijv. dit:
<?php
// ...
public function indexAction()
{
$request = $this->getRequest();

return new Response('Hello '.$request->request->get('name'));
}
?>
Deze geeft een Response object terug met de content 'Hello $_POST['name']'.

Ook de Response kun je data aanpassen, bijv. de headers:
<?php
// voor een json request
$response = new Response(json_encode(array('name' => $name)));
$response->headers->set('Content-Type', 'application/json');

// een 200 status code
$response = new Response('Hello '.$name, 200);
?>

Ik hoop dat het wat duidelijker is? Anders moet je je vraag wat specifieker stellen...
Hmmm, oké... het is gewoon dat ik mezelf afvraag... stel dat ik zelf een framework / cms maak, of ik dan ook een request en response object nodig heb. Stel ik heb een class met een function setName()... dan zou die setName() dus het Request object opvragen en daar de $_POST['name'] uithalen. Is dat correct? Maar dat betekent dus dat je een Request class hebt, waarin je eerst al je $_POST, $_GET, $_COOKIE, $_SESSION en header waardes stopt?

In mijn eerdere versies, als ik dan iets uit sesie moest halen, dan gebruikte ik daar een sessie class voor, bijvoorbeeld:
$name = Session::get('name');

Maar dit zou dan eigenlijk zo moeten?
$name = $request->get('name');

In jouw voorbeeld doe je dit:

<?php
$request->request->get('foo'); // $_POST['foo']
$request->query->get('bar'); // $_GET['bar']
// ...
?>
Waarom gebruik je voor de $_POST waarde $request->request en voor de $_GET waarde $request->query?
Maar dat betekent dus dat je een Request class hebt, waarin je eerst al je $_POST, $_GET, $_COOKIE, $_SESSION en header waardes stopt?

Ja, al zou ik het wel lazy-loading doen: Alleen doen als je het ook echt gebruikt:
<?php
class Request
{
private $query;
private $request;
private $server;
private $sessions;
private $cookies;
// ...

private function setQueryParameters()
{
if (null === $this->query) {
$this->query = new ParameterBag($_POST); // ParameterBag is een Iterator klasse voor parameters (zelf maken)
}
}

private function getQueryParameters()
{
$this->setQueryParameters();

return $this->query;
}

public function __get($name)
{
switch ($name) {
case 'request':
return $this->getQueryParameters();
break;

// ...
}
}
}

$request = new Request(); // nog niks geladen
$request->request; // de POST variabelen worden geladen
$request->request->get('foo'); // de POST variabelen worden niet opnieuw geladen
?>

In mijn eerdere versies, als ik dan iets uit sesie moest halen, dan gebruikte ik daar een sessie class voor, bijvoorbeeld:
$name = Session::get('name');

Maar dit zou dan eigenlijk zo moeten?
$name = $request->get('name');

Moeten is natuurlijk het verkeerde woord, in een HTTP framework gebeurd dat zo. En ik zou er eerder dit van maken:
<?php
$name = $request->getSession()->get('name');
?>

Waarom gebruik je voor de $_POST waarde $request->request en voor de $_GET waarde $request->query?

Je moet alle variabele gescheiden houden, dat is waarom we $_POST en $_GET gebruiken en niet $_REQUEST. Nu is een HTTP framework opgebouwd volgens de HTTP methoden. POST variabelen worden niet via de url mee verzonden, maar komen binnen via de request. Vandaar dat je die via $request->request kan krijgen.
De GET variabelen komen niet mee via de request, maar via de url. Een ander woord voor URL is query en dus kun je deze krijgen via $request->query.
Ah oké... daar kan ik wel weer even mee vooruit :-)
Thanks very much Wouter!!!

Reageren