A Revolução dos Middlewares
Zend Expressive
Paulo Eduardo
@pauloelr
PHPSP
www.phpsp.org.br
Objetivos
Protocolo HTTP
Protocolo HTTP
Requisição
POST /path HTTP/1.1
Host: example.com
foo=bar&baz=bat
Protocolo HTTP
Requisição
POST /path HTTP/1.1
Host: example.com
foo=bar&baz=bat
Processamento
Protocolo HTTP
Requisição
POST /path HTTP/1.1
Host: example.com
foo=bar&baz=bat
Processamento
Resposta
HTTP/1.1 200 OK
Content-Type: text/plain
This is the response body
PSR-7
<?php
namespace PsrHttpMessage;
interface MessageInterface
{
public function getProtocolVersion();
public function withProtocolVersion($version);
public function getHeaders();
public function hasHeader($name);
public function getHeader($name);
public function getHeaderLine($name);
public function withHeader($name, $value);
public function withAddedHeader($name, $value);
public function withoutHeader($name);
public function getBody();
public function withBody(StreamInterface $body);
}
PSR-7
<?php
namespace PsrHttpMessage;
interface RequestInterface extends MessageInterface
{
public function getRequestTarget();
public function withRequestTarget($requestTarget);
public function getMethod();
public function withMethod($method);
public function getUri();
public function withUri(UriInterface $uri, $preserveHost = false);
}
PSR-7
<?php
namespace PsrHttpMessage;
interface RequestInterface extends MessageInterface
{
public function getRequestTarget();
public function withRequestTarget($requestTarget);
public function getMethod();
public function withMethod($method);
public function getUri();
public function withUri(UriInterface $uri, $preserveHost = false);
}
<?php
namespace PsrHttpMessage;
interface ResponseInterface extends MessageInterface
{
public function getStatusCode();
public function withStatus($code, $reasonPhrase = ‘’);
public function getReasonPhrase();
}
Diactoros
<?php
$request = (new ZendDiactorosRequest())
->withUri(new ZendDiactorosUri(‘http://example.com’))
->withMethod(‘PATCH’)
->withAddedHeader(‘Authorization’, ‘Bearer ‘ . $token)
->withAddedHeader(‘Content-Type’, ‘application/json’);
Diactoros
<?php
$request = (new ZendDiactorosRequest())
->withUri(new ZendDiactorosUri(‘http://example.com’))
->withMethod(‘PATCH’)
->withAddedHeader(‘Authorization’, ‘Bearer ‘ . $token)
->withAddedHeader(‘Content-Type’, ‘application/json’);
<?php
$response = new ZendDiactorosResponse();
$response->getBody()->write(“some contentn”);
$response->getBody()->write(“more contentn”);
$response = $response
->withHeader(‘Content-Type’, ‘text/plain’)
->withAddedHeader(‘X-Show-Something’, ‘something’);
Middlewares
Middleware é um código que existe entre a
requisição e a resposta, podendo receber uma
requisição e realizar ações baseadas nela,
como retornar uma resposta ou delegar para o
próximo middleware na fila.
Documentação do Zend Stratigility
(Tradução Livre)
“ ”
Middlewares
Requisição Resposta
Middleware
Middleware
Application
Stratigility
<?php
use ZendStratigilityMiddlewarePipe;
use ZendDiactorosServer;
require __DIR__ . ‘/../vendor/autoload.php’;
$app = new MiddlewarePipe();
$app->pipe(‘/’, function ($req, $res, $next) {
if (! in_array($req->getUri()->getPath(), [‘/’, ‘’], true)) {
return $next($req, $res);
}
return $res->end(‘Hello world!’);
});
$app->pipe(‘/foo’, function ($req, $res, $next) {
return $res->end(‘FOO!’);
});
Zend Expressive
O Zend Expressive é desenvolvido com base
no Zend Stratigility para prover um framework
minimalista de Middlewares PSR-7 em PHP
Documentação do Zend Stratigility
(Tradução Livre)
“ ”
Zend Expressive
26 de Ago de 2015 - Versão 0.1.0
Zend Expressive
26 de Ago de 2015 - Versão 0.1.0
03 de Set de 2015 - Versão 0.2.0
Zend Expressive
26 de Ago de 2015 - Versão 0.1.0
03 de Set de 2015 - Versão 0.2.0
12 de Set de 2015 - Versão 0.3.0
Zend Expressive
26 de Ago de 2015 - Versão 0.1.0
03 de Set de 2015 - Versão 0.2.0
12 de Set de 2015 - Versão 0.3.0
28 de Jan de 2016 - Versão 1.0
Router
Aura Router
Router
Aura Router
Fast Router
Router
Aura Router
Fast Router
Zend Router
Dependency Injection Container
Aura
Dependency Injection Container
Aura
Pimple
Dependency Injection Container
Aura
Pimple
Zend Service Manager
Template Manager
Plates
Template Manager
Plates
Twig
Template Manager
Plates
Twig
Zend View
Let´s Code
Dúvidas
Obrigado

TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team at PHP.