Future of HTTP in CakePHP

Post on 23-Jan-2018

2.905 views 0 download

Transcript of Future of HTTP in CakePHP

The Future of HTTPIn CakePHP

First, the Present

Request & ResponseAdded in 2.0.0

Symfony HttpKernel& StackPHP

Symfony all the Things

PSR-7HTTP message interfaces

What’s the Problem?

HTTP in PHP is :(

$_POSTOnly works for POST methods and url-encoded

data.

$_SERVERNo-consistency, or normalization

Request URIHard to find.

File UploadsA pretty big mess.

Frameworks to the Rescue!

Not Invented HereEvery framework has their own HTTP stack

No Shared SolutionsSharing is caring

What do other languages do?

PythonWeb Server Gateway Interface

RubyRack

Go-Langhttp module in stdlib

Common TraitsAll these platforms have a single implementation.

PSR-7

Requests & Responses

Requests

ImmutableAll PSR7 objects are immutable*

// Read a header as text $value = $request->getHeaderLine(‘Content-Type’);

// Read header as an array $value = $request->getHeader(‘Content-Type’);

// Read all the headers $headers = $request->getHeaders();

Reading Headers

// Get an array of cookie values. $cookies = $request->getCookieParams();

// Get a list of UploadedFile objects $files = $request->getUploadedFiles();

// Read the file data. $files[0]->getStream(); $files[0]->getSize(); $files[0]->getClientFileName();

// Move the file. $files[0]->moveTo($targetPath);

Cookies & Files

// Get the URI $uri = $request->getUri();

// Read data out of the URI. $path = $uri->getPath(); $query = $uri->getQuery(); $host = $uri->getHost();

URL data

// Get the application base dir $base = $request->getAttribute(‘base’);

// Get the application webroot $webroot = $request->getAttribute(‘webroot’);

// Get the routing parameters $params = $request->getAttribute(‘params’);

Request Attributes

Responses

Also Immutable

// Bodies are also Streams. $body = new Stream(‘php://memory'); $body->write(‘{“ok”:true}’);

// Build up a response. $res->withHeader(‘Content-Type’, ‘application/json’) ->withStatus(204) ->withBody($body);

Building Responses

Middleware

CORS

Exceptions

Assets

Routes

App

CORS

Exceptions

Assets

Routes

App

Request

Response

CORS

Exceptions

Assets

Routes

AppRequest

Response

1. Must accept a Request, Response and ‘next’

2. Must return a Response, or call ‘next’

3. No more Rules.

Middleware Rules

Middleware Examples

$middleware = new \Cake\Http\MiddlewareStack();

// Catch any exceptions in the lower layers. $middleware->push(new ErrorHandlerMiddleware());

// Handle plugin/theme assets $middleware->push(new AssetMiddleware());

// Apply routing $middleware->push(new RoutingMiddleware());

// Apply CORS at the first middleware $middleware->prepend(new CorsMiddleware());

Setup Middleware

// Using closures $wow = function ($req, $res, $next) { $res = $res->withHeader(‘X-Wow’, ‘Wow’); return $next($req, $res); };

// Add to a middleware stack $middleware->push($wow);

Middleware

class WowMiddleware { public function __invoke($res, $req, $next) { $res = $res->withHeader(‘X-Wow’, ‘Wow’); return $next($req, $res); } }

// Add to a middleware stack $middleware->push(new WowMiddleware());

Middleware

Http\Client

$client = new Cake\Http\Client();

$res = $client->get(‘http://cakephp.org');

// Use PSR7 methods. $status = $res->getStatusCode(); $contentType = $res->getHeaderLine(‘Content-Type’); $body = $res->getBody()->getContents();

Client Example

Fully backwards compatible

Client Responses still support the current interface.

Sounds Nice, butis upgrading going to suck?

NopeIt should be painless really.

Timeline

Now

3.3 - Fall 2016

3.4 - Early 2017

4.0 - ?

PSR-7 in 3.3.0Opt-in stack that replaces DispatcherFilters

require dirname(__DIR__) . '/vendor/autoload.php';

use Cake\Http\Server; use App\Application;

// Bind your application to the server. $app = new Application(dirname(__DIR__) . ‘/config'); $server = new Server($app);

// Run the request/response and emit the response $server->emit($server->run());

index.php of the future

class Application extends BaseApplication { public function middleware($middleware) { // Catch any exceptions in the lower layers. $middleware->push(new ErrorHandlerMiddleware());

// Handle plugin/theme assets $middleware->push(new AssetMiddleware());

// Apply routing $middleware->push(new RoutingMiddleware()); return $middleware; } }

Application Class

3.4.0 Network\Request will implement PSR7

Future 3.x.0Runtime errors on deprecated methods.

4.0.0Clean up. Remove deprecations.

In Review1. PSR7 middleware is coming as an opt-in feature for 3.3.0

2. New applications will default to the new HTTP stack in 3.3.0

3. Controllers will have access to PSR7 methods in 3.4.0

4. Runtime deprecations will be introduced in a future 3.x

5. The code you write today will continue to work until 4.0.0.

Thank YouGithub - markstory

Twitter - mark_story https://joind.in/talk/3b577