zend\expressive - höher, schneller, weiter

50
1 ZEND\EXPRESSIVE h her - schneller - weiter CODE INSIDE

Upload: ralf-eggert

Post on 10-Jan-2017

432 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Zend\Expressive - höher, schneller, weiter

1

ZEND\EXPRESSIVE höher ­ schneller ­ weiter

CODE INSIDE

Page 2: Zend\Expressive - höher, schneller, weiter

2

RALF EGGERT

TrainerBerater

Autor

Insulaner

Speaker

Entwickler

ZF1seit 2006

ZF2seit 2012

ZF3seit 2016

GF

Travello

GmbH

www.ralfeggert.de

Page 3: Zend\Expressive - höher, schneller, weiter

3

1 PSR-7 / Middleware

2Middleware für Aktionen3

Zend\Expressive Überblick

Middleware für die Pipeline4Und was ist mit Tee MVC?5

Page 4: Zend\Expressive - höher, schneller, weiter

4

1 PSR-7 / Middleware

Page 5: Zend\Expressive - höher, schneller, weiter

5

WAS ISTPSR-7?

Page 6: Zend\Expressive - höher, schneller, weiter

6

PSR­4

Autoload PSR­2

CodingPSR­1Coding

PSR­3Logging PSR­6

Caching

PSR­7HTTP

PHP-FIGwww.php­fig.org

PSR­11

???PSR­14

???

PSR­15

???

Page 7: Zend\Expressive - höher, schneller, weiter

7

<?phpnamespace Psr\Http\Message;

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);}

PS

R-7

ME

SS

AG

E IN

TE

RF

AC

E

Page 8: Zend\Expressive - höher, schneller, weiter

8

<?phpnamespace Psr\Http\Message;

interface RequestInterface extends MessageInterface {}

interface ServerRequestInterface extends RequestInterface {}

interface ResponseInterface extends MessageInterface {}

interface StreamInterface {}

interface UploadedFileInterface {}

interface UriInterface{}

PS

R-7

WE

ITE

RE

INT

ER

FA

CE

S

Page 9: Zend\Expressive - höher, schneller, weiter

9

WAS ISTMIDDLEWARE?

Page 10: Zend\Expressive - höher, schneller, weiter

10

CLIENT WEBSERVER

HTTPREQUEST

HTTPRESPONSE

HTTP

Page 11: Zend\Expressive - höher, schneller, weiter

11

MIDDLEWARE

HTTP

REQUEST

HTTP

RESPONSEMIDDLEWARE

Page 12: Zend\Expressive - höher, schneller, weiter

12

MIDDLEWAREPIPELINE

HTTP

REQUEST

HTTP

RESPONSE MIDDLEWARE 1 MIDDLEWARE 2 MIDDLEWARE 3

Page 13: Zend\Expressive - höher, schneller, weiter

13

<?phpinterface LambdaMiddlewareInterface{ /** * @param RequestInterface $request * @return ResponseInterface */ public function __invoke($request);}

LA

MB

DA

M

IDD

LE

WA

RE

INT

ER

FA

CE

Page 14: Zend\Expressive - höher, schneller, weiter

14

<?phpinterface InjectedResponseMiddlewareInterface{ /** * @param RequestInterface $request * @param ResponseInterface $response * @return ResponseInterface */ public function __invoke($request, $response);}

INJE

CT

ED

RE

SP

ON

SE

MID

DL

EW

AR

EIN

TE

RF

AC

E

Page 15: Zend\Expressive - höher, schneller, weiter

15

<?phpinterface InjectedNextMiddlewareInterface{ /** * @param RequestInterface $request * @param ResponseInterface $response * @param callable $next * @return ResponseInterface */ public function __invoke( $request, $response, $next = null );}

INJE

CT

ED

NE

XT

M

IDD

LE

WA

RE

INT

ER

FA

CE

used by ZF3

Page 16: Zend\Expressive - höher, schneller, weiter

16

2 Zend\Expressive Überblick

Page 17: Zend\Expressive - höher, schneller, weiter

17

FRAMEWORK SILOS

Page 18: Zend\Expressive - höher, schneller, weiter

18

FRAMEWORK SILOS

Page 19: Zend\Expressive - höher, schneller, weiter

19

ZEND\DIACTOROS

ZEND\STRATIGILITY

ZEND\EXPRESSIVE

ZF KOMPONENTEN

PSR-7

MIDDLEWARE

MIDDLEWAREAPPLICATIONS

Page 20: Zend\Expressive - höher, schneller, weiter

20

ROUTER DI CONTAINER TEMPLATERENDERER

ERRORHANDLER

Aura.Router

FastRoute

Zend\Router

Weitere Router

Aura.DI

Pimple­interop

Zend\ServiceManager

WeitereDI Container

Plates

Twig

Zend\View

WeitereTemplate­Engine

Whoops

WeitererError­Handler

ZEND\EXPRESSIVEZUTATEN

Page 21: Zend\Expressive - höher, schneller, weiter

21

PERFORMANCEMESSDATEN

Gemessen im April 2016 mit der Zend\Expressive Skeleton 1.0.1

AD = Aura.DI, AR = Aura.Router, FR = FastRoute, ZR = Zend\Router, ZS = Zend\ServiceManager, ZV = Zend\View

Laufzeit (ms) 31,8 106,5 43,8 31,9 103,8 44,9 42,7 117,2 56,1 35,6 31,3

Router FR FR FR AR AR AR ZR ZR ZR FR FR

DI Container ZS ZS ZS ZS ZS ZS ZS ZS ZS AD Pimple

Renderer Plates Twig ZV Plates Twig ZV Plates Twig ZV Plates Plates

Page 22: Zend\Expressive - höher, schneller, weiter

22

PERFORMANCEERKENNTNISSE

AD = Aura.DI, AR = Aura.Router, FR = FastRoute, ZR = Zend\Router, ZS = Zend\ServiceManager, ZV = Zend\View

AR FRZR

ROUTER

Plates

Twig

ZV

RENDERER

AD Pimple ZS

DI CONTAINER

Page 23: Zend\Expressive - höher, schneller, weiter

23

PERFORMANCEFAZIT

AD = Aura.DI, AR = Aura.Router, FR = FastRoute, ZR = Zend\Router, ZS = Zend\ServiceManager, ZV = Zend\View

FR

SCHNELLSTEVARIANTE

PlatesPimple

PS: Traue keiner Statistik, die du nicht selber gefälscht hast! ;­)

ZR

REINE ZFVARIANTE

ZVZS

Page 24: Zend\Expressive - höher, schneller, weiter

24

INSTALLATION$ composer create-project ⏎ zendframework/zend-expressive-skeleton ⏎ /var/www/zend-expressive-skeleton$ cd /var/www/zend-expressive-skeleton$ composer serve

Page 25: Zend\Expressive - höher, schneller, weiter

25

ZE

ND

\ EX

PR

ES

SIV

ESK

EL

ET

ON

AP

PL

ICA

TIO

N

Page 26: Zend\Expressive - höher, schneller, weiter

26

VERZEICHNISSTRUKTUR config autoload data cache public src Application Action templates application error layout test ApplicationTest Action vendor composer.json

config autoload data cache modules Application config src Action templates application error layout test Action public vendor composer.json

MO

DU

LA

R

EIN

FA

CH

Page 27: Zend\Expressive - höher, schneller, weiter

27

CO

NF

I GM

AN

AG

ER

$ composer require mtymek/expressive-config-manager

<?php// Datei /config/config.php

use Zend\Expressive\ConfigManager\ConfigManager;use Zend\Expressive\ConfigManager\PhpFileProvider;

$configManager = new ConfigManager([ Application\ConfigProvider::class, new PhpFileProvider( 'config/autoload/{{,*.}global,{,*.}local}.php' ),]);

return new ArrayObject( $configManager->getMergedConfig());

Page 28: Zend\Expressive - höher, schneller, weiter

28

CO

NF

I GP

RO

VID

ER

<?php// Datei /modules/Application/src/ConfigProvider.php

namespace Application;

use Zend\Config\Factory;

class ConfigProvider{ public function __invoke() { return Factory::fromFile( __DIR__ . '/../config/module.config.php' ); }}

Page 29: Zend\Expressive - höher, schneller, weiter

29

CO

MP

ON

EN

TIN

ST

AL

LE

R$ composer require ⏎ zendframework/zend-component-installer$ composer require zendframework/zend-db

<?php// Datei /config/config.php

use Zend\Expressive\ConfigManager\ConfigManager;use Zend\Expressive\ConfigManager\PhpFileProvider;

$configManager = new ConfigManager([ Zend\Db\ConfigProvider::class, Application\ConfigProvider::class, new PhpFileProvider( 'config/autoload/{{,*.}global,{,*.}local}.php' ),]);

return new ArrayObject( $configManager->getMergedConfig());

Page 30: Zend\Expressive - höher, schneller, weiter

30

Middleware für Aktionen3

Page 31: Zend\Expressive - höher, schneller, weiter

31

AKTIONEN BEISPIELE

Page 32: Zend\Expressive - höher, schneller, weiter

32

TEMPLATE

BAUSTEINE AKTION

ROUTING

MIDDLEWARE

KONFIGURATION

Page 33: Zend\Expressive - höher, schneller, weiter

33MID

DL

EW

AR

Enamespace Pizza\Action;

use Application\Template\TemplateRendererInterface;use Pizza\Model\Repository\PizzaRepositoryInterface;

class ShowIntroAction{ /* ... */

public function __invoke( ServerRequestInterface $request, ResponseInterface $response, callable $next = null ) { $pizzas = $this->pizzaRepository->getPizzas();

return new HtmlResponse( $this->renderer->render( 'pizza::intro', ['pizzas' => $pizzas] ) ); }}

Page 34: Zend\Expressive - höher, schneller, weiter

34ZE

ND

\VI E

WT

EM

PL

AT

E<?php foreach ($this->pizzas as $pizza) : ?> <?php $urlShow = $this->url( 'pizza-show', ['id' => $pizza['id']] ); ?> <div class="col-md-4"> <div class="thumbnail text-center"> <a href="<?= $urlShow; ?>"> <img src="<?= $pizza['image'] ?>" title="<?= $pizza['name'] ?>"> </a> </div> </div><?php endforeach ?>

Page 35: Zend\Expressive - höher, schneller, weiter

35

return [ 'routes' => [ [ 'name' => 'pizza-intro', 'path' => '/pizza', 'middleware' => Pizza\Action\ShowIntroAction::class, 'allowed_methods' => ['GET'], ], [ 'name' => 'pizza-handle-delete', 'path' => '/pizza/delete/:id', 'middleware' => Pizza\Action\DeletePizzaAction::class, 'allowed_methods' => ['POST'], 'options' => [ 'constraints' => [ 'id' => '[1-9][0-9]*', ], ], ], ],];

ZE

ND

\ RO

UT

ER

RO

UT

ING

Page 36: Zend\Expressive - höher, schneller, weiter

36

namespace PizzaRest\Action;

class GetIdAction{ use PizzaRepositoryAwareTrait;

public function __invoke( ServerRequestInterface $request, ResponseInterface $response, callable $next = null ) { $pizza = $this->pizzaRepository->getSinglePizza( $request->getAttribute('id') );

if (!$pizza) { return new JsonResponse( ['err' => 'Not found'] ); } return new JsonResponse($pizza); }}

RE

ST

AK

TIO

N

Page 37: Zend\Expressive - höher, schneller, weiter

37

Middleware für die Pipeline4

Page 38: Zend\Expressive - höher, schneller, weiter

38

HTTP

REQUEST

HTTP

RESPONSE

ROUTING

MIDDLEWARE

URL HELPER

MIDDLEWARE

DISPATCHING

MIDDLEWARE

ZEND\EXPRESSIVEMW PIPELINE

Page 39: Zend\Expressive - höher, schneller, weiter

39

HTTP

REQUEST

HTTP

RESPONSE

LOCALIZATION

MIDDLEWARE

AUTHENTICATION

MIDDLEWARE

AUTHORIZATION

MIDDLEWARE

KOMPLEXEREMW PIPELINE

Page 40: Zend\Expressive - höher, schneller, weiter

40

use Zend\Expressive\Container\ApplicationFactory;use Zend\Expressive\Helper;return [ 'middleware_pipeline' => [ 'always' => [ 'middleware' => [ Helper\ServerUrlMiddleware::class, ], 'priority' => 10000, ], 'routing' => [ 'middleware' => [ ApplicationFactory::ROUTING_MIDDLEWARE, Helper\UrlHelperMiddleware::class, ApplicationFactory::DISPATCH_MIDDLEWARE, ], 'priority' => 1, ], 'error' => [ 'middleware' => [], 'error' => true, 'priority' => -10000, ], ],];

DE

FA

UL

TK

ON

FIG

UR

AT

ION

Page 41: Zend\Expressive - höher, schneller, weiter

41

use I18n\Middleware\LocalizationMiddleware;use User\Authorization\AuthenticationMiddleware;use User\Authorization\AuthorizationMiddleware;use Zend\Expressive\Container\ApplicationFactory;use Zend\Expressive\Helper;

return [ 'middleware_pipeline' => [ 'always' => [ /* ... */ ], 'routing' => [ 'middleware' => [ ApplicationFactory::ROUTING_MIDDLEWARE, Helper\UrlHelperMiddleware::class, LocalizationMiddleware::class, AuthenticationMiddleware::class, AuthorizationMiddleware::class, ApplicationFactory::DISPATCH_MIDDLEWARE, ], 'priority' => 1, ], 'error' => [ /* ... */ ], ],];

KO

MP

LE

XE

RE

KO

NF

IGU

RA

TIO

N

Page 42: Zend\Expressive - höher, schneller, weiter

42

namespace User\Authorization;

class AuthorizationMiddleware{ public function __invoke( ServerRequestInterface $request, ResponseInterface $response, callable $next ) { $permission = $result->getMatchedRouteName();

if (!$this->rbac->isGranted($this->role, $permission)) { if ($this->role == GuestRole::NAME) { throw new RuntimeException( 'Nicht angemeldet', 401 ); } else { throw new RuntimeException('Kein Zugriff', 403); } } return $next($request, $response); }}

AU

TH

OR

IZA

TIO

N

MI D

DL

EW

AR

E

Page 43: Zend\Expressive - höher, schneller, weiter

43AU

TH

OR

IZA

TIO

NF

EH

LG

ES

CH

LA

GE

N

Page 44: Zend\Expressive - höher, schneller, weiter

44

Und was ist mit Tee MVC?5

Page 45: Zend\Expressive - höher, schneller, weiter

45

WARUMNOCH MVC,

WENN WIR NUN MIDDLEWARE

HABEN?

Page 46: Zend\Expressive - höher, schneller, weiter

MVCMW Neues

Konzept

WenigeModule

MiddlewarePipeline

SchwerereIntegration

unerfahreneEntwickler

NeueProjekte

Migrationkomplexer

sehrperformant

erprobt& stabil

vieleModule

Migrationeinfach

LeichteIntegration

erfahreneEntwickler

EventManager

Bestands­projekte

wenigerperformant

Zukunft Gegenwart

Page 47: Zend\Expressive - höher, schneller, weiter

47

TUTORIAL

https://github.com/RalfEggert/zend­expressive­tutorial

Page 48: Zend\Expressive - höher, schneller, weiter

48

ACHTUNG! WERBUNG!

www.zendframeworkbuch.de

Page 49: Zend\Expressive - höher, schneller, weiter

49

DANKE!FRAGEN?

Page 50: Zend\Expressive - höher, schneller, weiter

50

1Digging In

von Zach DischnerFlickr CC BY 2.0 5

Pipesvon Leonid Mamchenkov

Flickr CC BY 2.0

17Monument valleyvon Moyan BrennFlickr CC BY 2.0

30»and... action«

von Latin SnakeFlickr CC BY 2.0

44Und was ist mit Tee?

aus der Giotto WerbungYouTube

37Pipeline

von jasonwoodhead23Flickr CC BY 2.0

4A flowery meadowvon Michael FigielFlickr CC BY 2.0

BILDNACHWEIS

49free high res texture 380

von Caleb KimbroughFlickr CC BY 2.0