Upload
markstory
View
2.905
Download
0
Embed Size (px)
Citation preview
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