no-framework-tutorial/04-http.md
Madara c20b26c684 Add leading zeros so that files list in correct order
Fix all links to new file names
2015-01-14 15:46:29 +02:00

3.2 KiB

<< previous | next >>

HTTP

PHP already has a few things built in to make working with HTTP easier. For example there are the superglobals that contain the request information.

These are good if you just want to get a small script up and running without much thought on maintenance. However, if you want to write clean, maintainable, SOLID code, then you will want a class with a nice object-oriented interface that you can use in your application.

Once again, you don't have to reinvent the wheel and just install a package. I decided to write my own HTTP component because I did not like the existing components, but you don't have to do the same.

Some alternatives: Symfony HttpFoundation, Nette HTTP Component, Aura Web, sabre/http

In this tutorial I will use my own HTTP component, but of course you can use whichever package you like most. Just change the code accordingly.

Again, edit the composer.json to add the new component and then run composer update:

"require": {
    "php": ">=5.5.0",
    "filp/whoops": ">=1.1.2",
    "patricklouys/http": ">=1.1.0"
},

Now you can add the following below your error handler code in your Bootstrap.php (and don't forget to remove the exception):

$request = new \Http\HttpRequest($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
$response = new \Http\HttpResponse;

This sets up the Request and Response objects that you can use in your other classes to get request data and send a response back to the browser.

To actually send something back, you will also need to add the following snippet at the end of your Bootstrap.php file:

foreach ($response->getHeaders() as $header) {
    header($header);
}

echo $response->getContent();

This will send the response data to the browser. If you don't do this, nothing happens as the Response object only stores data. This is handled differently by most other HTTP components where the classes send data back to the browser as a side-effect, so keep that in mind if you use another component.

Right now it is just sending an empty response back to the browser with the status code 200; to change that, add the following code between the code snippets from above:

$content = '<h1>Hello World</h1>';
$response->setContent($content);

If you want to try a 404 error, use the following code:

$response->setContent('404 - Page not found');
$response->setStatusCode(404);

Remember that the object is only storing data, so you if you set multiple status codes before you send the response, only the last one will be applied.

I will show you in later parts how to use the different features of the components. In the meantime, feel free to read the documentation or the source code if you want to find out how something works.

<< previous | next >>