KEMBAR78
Future of HTTP in CakePHP | PDF
The Future of HTTP
In CakePHP
First, the Present
Request & Response
Added in 2.0.0
Symfony HttpKernel
& StackPHP
Symfony all
the Things
PSR-7
HTTP message interfaces
What’s the Problem?
HTTP in PHP is :(
$_POST
Only works for POST methods and url-encoded
data.
$_SERVER
No-consistency, or normalization
Request URI
Hard to find.
File Uploads
A pretty big mess.
Frameworks to
the Rescue!
Not Invented Here
Every framework has their own HTTP stack
No Shared Solutions
Sharing is caring
What do other
languages do?
Python
Web Server Gateway Interface
Ruby
Rack
Go-Lang
http module in stdlib
Common Traits
All these platforms have a single implementation.
PSR-7
Requests &
Responses
Requests
Immutable
All 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
App
Request
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 CakeHttpMiddlewareStack();
// 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
HttpClient
$client = new CakeHttpClient();
$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, but
is upgrading going to suck?
Nope
It should be painless really.
Timeline
Now
3.3 - Fall 2016
3.4 - Early 2017
4.0 - ?
PSR-7 in 3.3.0
Opt-in stack that replaces DispatcherFilters
require dirname(__DIR__) . '/vendor/autoload.php';
use CakeHttpServer;
use AppApplication;
// 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
NetworkRequest will implement PSR7
Future 3.x.0
Runtime errors on deprecated methods.
4.0.0
Clean up. Remove deprecations.
In Review
1. 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 You
Github - markstory
Twitter - mark_story
https://joind.in/talk/3b577

Future of HTTP in CakePHP