IPC 2015 Zend Framework 3 Reloaded

61
Zend Framework 3 Zend Framework 3 Reloaded Reloaded Repository: https://github.com/RalfEggert/ipc2015-zf3-reloaded Repository: https://github.com/RalfEggert/ipc2015-zf3-reloaded 1 / 61 [b01] [b01]

Transcript of IPC 2015 Zend Framework 3 Reloaded

Page 1: IPC 2015 Zend Framework 3 Reloaded

Zend Framework 3Zend Framework 3ReloadedReloaded

Repository: https://github.com/RalfEggert/ipc2015-zf3-reloadedRepository: https://github.com/RalfEggert/ipc2015-zf3-reloaded

1 / 61

[b01][b01]

Page 2: IPC 2015 Zend Framework 3 Reloaded

2 / 61

www.ralfeggert.dewww.ralfeggert.de

Über michÜber mich

Page 3: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

33 / / 6161

Page 4: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

44 / / 6161

Page 5: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

55 / / 6161

Page 6: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

66 / / 6161

Page 7: IPC 2015 Zend Framework 3 Reloaded

ZF1/ZF2 HistorieZF1/ZF2 Historie PHP Welt HEUTEPHP Welt HEUTE Ziele ZF3Ziele ZF3

Komponenten reloadedKomponenten reloaded Zend\ExpressiveZend\Expressive ZF3 AusblickZF3 Ausblick

7 / 61

[B06][B06][B05][B05][B04]

[B09][B09][B08][B08][B07][B07]

AgendaAgenda

Page 8: IPC 2015 Zend Framework 3 Reloaded

[B04]

88 / / 6161

ZF1 / ZF2 HistorieZF1 / ZF2 Historie

Page 9: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

99 / / 6161

Page 10: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

1010 / / 6161

Page 11: IPC 2015 Zend Framework 3 Reloaded

11 / 61

Zend Framework 1 und 2 HistorieZend Framework 1 und 2 Historie

2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016

Version 0.1(02.03.2006)

Version 1.0(30.06.2006)

Version 1.5(17.03.2008)

Version 1.6(02.09.2008)

Version 1.7(17.11.2008)

Version 1.8(30.04.2009)

Version 1.9(31.07.2009)

Version 1.10(27.01.2010)

Version 1.11(02.11.2010)

Version 1.12(27.08.2012)

Version 2.0(04.09.2012)

Version 2.1(30.01.2013)

Version 2.2(15.05.2013)

Version 2.3(12.03.2014)

Version 2.4(31.03.2015)

Version 2.5(30.06.2015)

Page 12: IPC 2015 Zend Framework 3 Reloaded

12 / 61

Zend Framework 1Zend Framework 1

Erschienen: 2006Letztes Update: 2015

Letzte Version: 1.12.16

1Download Archiv

GitHubhttps://github.com/zendframework/zf1

EngeKopplung

68Komponenten

1Repository

Page 13: IPC 2015 Zend Framework 3 Reloaded

13 / 61

Zend Framework 2Zend Framework 2Erschienen: 2012

Letztes Update: 2015Letzte Version: 2.4.8

LTS bis: 2018

1Download Archiv

GitHubhttps://github.com/zendframework/zf2

LosereKopplung

49Komponenten

1Repository

vielePackages

Page 14: IPC 2015 Zend Framework 3 Reloaded

1414 / / 6161

Zend Framework 2 Revolution→Zend Framework 2 Revolution→[B10][B10]

Page 15: IPC 2015 Zend Framework 3 Reloaded

1515 / / 6161

Migration ZF1 ZF2 desaster→ →Migration ZF1 ZF2 desaster→ →[B11][B11]

Page 16: IPC 2015 Zend Framework 3 Reloaded

[B05][B05]

1616 / / 6161

PHP Welt heutePHP Welt heute

Page 17: IPC 2015 Zend Framework 3 Reloaded

1717 / / 6161

PHP 7PHP 7[B12][B12]

Page 18: IPC 2015 Zend Framework 3 Reloaded

18 / 61

ComposerComposer

Page 19: IPC 2015 Zend Framework 3 Reloaded

19 / 61

PHP FIGPHP FIG

PSR-7PSR-4PSR-2

PSR-0

Page 20: IPC 2015 Zend Framework 3 Reloaded

2020 / / 6161

PSR-7 HTTP Message InterfacesPSR-7 HTTP Message Interfaces[B13][B13]

Page 21: IPC 2015 Zend Framework 3 Reloaded

[B06][B06]

2121 / / 6161

Ziele für Zend Framework 3Ziele für Zend Framework 3

Page 22: IPC 2015 Zend Framework 3 Reloaded

2222 / / 6161

Komponenten separierenKomponenten separieren[B14][B14]

Page 23: IPC 2015 Zend Framework 3 Reloaded

2323 / / 6161

PerformancePerformance[B15][B15]

Page 24: IPC 2015 Zend Framework 3 Reloaded

2424 / / 6161

UsabilityUsability[B16][B16]

Page 25: IPC 2015 Zend Framework 3 Reloaded

25 / 61

PSR-7 / MiddlewarePSR-7 / Middleware[B17]

Page 26: IPC 2015 Zend Framework 3 Reloaded

2626 / / 6161

MigrationMigration[B18][B18]

Page 27: IPC 2015 Zend Framework 3 Reloaded

27 / 61

{ "name": "zendframework/zendframework", "description": "Zend Framework 2", "require": { "php": ">=5.5", "zendframework/zend-authentication": "~2.5.0", "zendframework/zend-barcode": "~2.5.0", "zendframework/zend-cache": "~2.5.0", "zendframework/zend-captcha": "~2.5.0", "zendframework/zend-code": "~2.5.0", "zendframework/zend-config": "~2.5.0", "zendframework/zend-console": "~2.5.0", "zendframework/zend-crypt": "~2.5.0", "zendframework/zend-db": "~2.5.0", "zendframework/zend-debug": "~2.5.0", [...] }}

Neue Composer.json (ZF 2.5)Neue Composer.json (ZF 2.5)

Page 28: IPC 2015 Zend Framework 3 Reloaded

[B07][B07]

2828 / / 6161

Komponenten reloadedKomponenten reloaded

Page 29: IPC 2015 Zend Framework 3 Reloaded

29 / 61

Zend\ServiceManagerZend\ServiceManager

Container Interoperabilityhttps://github.com/container-interop/container-interop

Einheitliche Interface&

WiederverwendbareFactories

GitHubhttps://github.com/zendframework/zend-servicemanager

Fast vollständigRückwärtskompatibel

Performance4x schneller

Neue build() Methode

Factories perInterface oder

InvokableMigration-Guide:11 DIN A4 Seiten

Service Identifier Best Practice:class name resolution syntax

Page 30: IPC 2015 Zend Framework 3 Reloaded

30 / 61

// ArticleEntity::class mit PHP 5.5 eingeführt

return [ 'service_manager' => [ 'invokables' => [ Blog\Entity\ArticleEntity::class => Blog\Entity\ArticleEntity::class, ], 'factories' => [ Blog\Table\ArticleTable::class => Blog\Table\ArticleTableFactory::class, ], ],];

Best practice: Class Name resolutionBest practice: Class Name resolution

Page 31: IPC 2015 Zend Framework 3 Reloaded

31 / 61

return [ 'service_manager' => [ 'invokables' => [ Blog\Entity\ArticleEntity::class => Blog\Entity\ArticleEntity::class, ], ],];

$entity1 = $sm->get(Blog\Entity\ArticleEntity::class);$entity2 = $sm->get(Blog\Entity\ArticleEntity::class);

var_dump($entity1 === $entity2); // prints "true"

$entity1 = $sm->build(Blog\Entity\ArticleEntity::class);$entity2 = $sm->build(Blog\Entity\ArticleEntity::class);

var_dump($entity1 === $entity2); // prints "false"

Neue Build() MethodeNeue Build() Methode

Page 32: IPC 2015 Zend Framework 3 Reloaded

32 / 61

Zend\EventManagerZend\EventManager

BC Break I:Keine Überladung der

trigger() Methoden mehr

BC Break II:Anhängen von Listener-Aggregaten verändert

GitHubhttps://github.com/zendframework/zend-eventmanager

Performance4x bis 15x schneller

BC Break III:GlobalEventManager &

StaticEventManagerentfernt

BC Break IV:SharedEventManager

Einsatz verändert

Migration-Guide:10 DIN A4 Seiten

Page 33: IPC 2015 Zend Framework 3 Reloaded

33 / 61

// VORHER: Parameter konnten überladen werden// $event => String, Array/Traversable ODER EventInterface// $target => Callable, EventInterface ODER ein Value// $argv => Callable, EventInterface ODER ein Array // $callback => Callable ODER null

trigger($event, $target = null, $argv = [], $callback = null);triggerUntil($event, $target = null, $argv = [], $callback = null);

// NACHHER: keine Parameter Überladung mehr// $event => String// $target => Value für Target// $argv => Array mit Event Parametern

trigger($event, $target = null, $argv = []);triggerUntil($callback, $event, $target = null, $argv = []);

Geänderte Trigger() MethodenGeänderte Trigger() Methoden

Page 34: IPC 2015 Zend Framework 3 Reloaded

34 / 61

// VORHER: 3 Varianten$eventManager = new EventManager();$listenerAggregate = new MyListenerAggregate();

$eventManager->attach($listenerAggregate); // Variante 1$eventManager->attachAggregate($listenerAggregate); // Variante 2$listenerAggregate->attach($eventManager); // Variante 3

// NACHHER: 1 Variante$eventManager = new EventManager();$listenerAggregate = new MyListenerAggregate();

$listenerAggregate->attach($eventManager);

Aggregate AttachmentAggregate Attachment

Page 35: IPC 2015 Zend Framework 3 Reloaded

35 / 61

Zend\MVCZend\MVC

Änderungen von Zend\ServiceManager

übernommen

Änderungen von Zend\EventManager

übernommen

GitHubhttps://github.com/zendframework/zend-mvc

Neuer MiddlewareListener

Bleibt im Grundunverändert

Refaktorierungvoraussichtlich abgeschlossen:

Anfang Dezember 2015

Migration-Guide:2 DIN A4 Seiten

(bisher)

Page 36: IPC 2015 Zend Framework 3 Reloaded

36 / 61

Neu: Zend\DiactorosNeu: Zend\Diactoros

»Diactoros« an epithet forHermes, meaning literally,

»the messenger.«

PHP FIG(Framework Interop Group)

PSR-7(HTTP Message Interfaces)

GitHubhttps://github.com/zendframework/zend-diactoros

ServerseitigeApplikationen

HTTP Clients

Page 37: IPC 2015 Zend Framework 3 Reloaded

37 / 61

use Zend\Diactoros\Request;use Zend\Diactoros\Uri;

// Create request$request = new Request();$request->withUri(new Uri('http://website.com'));$request->withMethod('POST');$request->withAddedHeader('Authorization', 'Bearer ' . $token);$request->withAddedHeader('Content-Type', 'application/json');$request->getBody()->write(json_encode($data));

// Send request to get response$response = $client->send($request);

// Get data from response$statusCode = $response->getStatusCode();$reasonPhrase = $response->getReasonPhrase();$headers = $response->getHeaders();$body = $response->getBody();

Zend\Diactoros HTTP ClientZend\Diactoros HTTP Client

Page 38: IPC 2015 Zend Framework 3 Reloaded

38 / 61

use Zend\Diactoros\ServerRequestFactory;use Zend\Diactoros\Response;

// Create request from superglobals$request = ServerRequestFactory::fromGlobals( $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);

// Get data from request$uploadedFiles = $request->getUploadedFiles();$queryParams = $request->getQueryParams();

// Create response and fill with data$response = new Response();$response->withHeader('Content-Type', 'application/json');$response->withAddedHeader('X-Zend-Framework', 'Diactoros');$response->getBody()->write(json_encode($data));

Zend\Diactoros Server ApplikationZend\Diactoros Server Applikation

Page 39: IPC 2015 Zend Framework 3 Reloaded

39 / 61

Neu: Zend\StratigilityNeu: Zend\Stratigility

»Stratigility« comes from»Strata«, Latin for »layer«,

and »agility«.

Applikationen auf Basis von Middleware

umsetzen

GitHubhttps://github.com/zendframework/zend-stratigility

RequestMiddleware

Response

MiddlewarePipeline

Setzt auf Zend\Diactoros auf

AuthenticationMiddleware

ErrorHandler

Middleware

Page 40: IPC 2015 Zend Framework 3 Reloaded

40 / 61

use Zend\Stratigility\MiddlewarePipe;

// Create middleware pipe$app = new MiddlewarePipe();

// Output homepage or delegate to next middleware$app->pipe('/', function ($request, $response, $next) { $path = $request->getUri()->getPath(); if (! in_array($path, ['/', ''], true)) { return $next($request, $response); } return $response->end('Homepage!');});

// Output foo page$app->pipe('/foo', function ($request, $response, $next) { return $response->end('FOO!');});

Zend\Stratigility MiddlewareZend\Stratigility Middleware

Page 41: IPC 2015 Zend Framework 3 Reloaded

41 / 61

use Zend\Stratigility\MiddlewarePipe;use Zend\Diactoros\Server;

// Create middleware pipe$app = new MiddlewarePipe();

// Create server$server = Server::createServer( $app, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);

// Add middleware to pipe$app->pipe([...]);$app->pipe([...]);$app->pipe([...]);

// Let the server listen$server->listen();

Zend\Stratigility ServerZend\Stratigility Server

Page 42: IPC 2015 Zend Framework 3 Reloaded

[B08][B08]

4242 / / 6161

Zend\ExpressiveZend\Expressive

Page 43: IPC 2015 Zend Framework 3 Reloaded

4343 / / 6161

MiddlewareMiddleware[B19][B19]

Page 44: IPC 2015 Zend Framework 3 Reloaded

4444 / / 6161

Middleware ohne und mit PipeMiddleware ohne und mit Pipe

Client MIDDLEWARERequest Response

Client Request Response

Middleware Middleware Middleware

Client

MW PIPE Client

Page 45: IPC 2015 Zend Framework 3 Reloaded

45 / 61

Zend\ExpressiveZend\Expressive

»Begin developing PSR-7middleware applications

in minutes!«.Mikroframework

für PSR-7 MiddlewareAnwendungen

GitHubhttps://github.com/zendframework/zend-expressive

Routing:Aura.RouterFastRoute

Zend\Mvc\Router

Templating:PlatesTwig

Zend\View

Setzt auf Zend\Stratigility und Zend\Diactoros auf

Dependency InjectionContainer:

Zend\ServiceManagerPimpleAura.Di

ErrorHandling:Whoops

APIsKomplexe Websites

Single Page ApplikationenKonsolenanwendungen

Page 46: IPC 2015 Zend Framework 3 Reloaded

4646 / / 6161

Zend\Expressive Skeleton ApplicationZend\Expressive Skeleton Application

https://github.com/zendframework/zend-expressive-skeletonhttps://github.com/zendframework/zend-expressive-skeleton

Page 47: IPC 2015 Zend Framework 3 Reloaded

47 / 61

use Zend\Expressive\AppFactory;use Zend\ServiceManager\ServiceManager;

require __DIR__ . '/../vendor/autoload.php';

$container = new ServiceManager();$container->setFactory('HelloWorld', function ($container) {});$container->setFactory('Ping', function ($container) {});

$app = AppFactory::create($container);$app->get('/', 'HelloWorld');$app->get('/ping', 'Ping');$app->run();

Bootstrapping: einfachBootstrapping: einfach

Page 48: IPC 2015 Zend Framework 3 Reloaded

48 / 61

require __DIR__ . '/../vendor/autoload.php';

$container = include __DIR__ . '/../config/services.php';

$app = $container->get('Zend\Expressive\Application');$app->run();

Bootstrapping: mit KonfigurationBootstrapping: mit Konfiguration

Page 49: IPC 2015 Zend Framework 3 Reloaded

49 / 61

// Datei /config/services.phpuse Zend\Config\Factory as ConfigFactory;use Zend\ServiceManager\Config;use Zend\ServiceManager\ServiceManager;

$config = ConfigFactory::fromFiles( glob('config/autoload/{,*.}{global,local}.php', GLOB_BRACE));

$serviceManager = new ServiceManager( new Config($config['services']));$serviceManager->setService('config', $config);

return $serviceManager;

Ausgelagerte Konfiguration IAusgelagerte Konfiguration I

Page 50: IPC 2015 Zend Framework 3 Reloaded

50 / 61

// Datei /config/autoload/global.phpreturn [ 'routes' => [ [ 'path' => '/', 'middleware' => 'Application\HelloWorld', 'allowed_methods' => [ 'GET' ], ], ], 'services => [ 'invokables' => [ Application\HelloWorld::class => Application\HelloWorld::class, ], 'factories' => [ Zend\Expressive\Application::class => Zend\Expressive\Container\ApplicationFactory::class, ], ],];

Ausgelagerte Konfiguration IIAusgelagerte Konfiguration II

Page 51: IPC 2015 Zend Framework 3 Reloaded

51 / 61

// Datei /src/Application/HelloWorld.phpnamespace Application;

class HelloWorld{ public function __invoke($req, $res, $next) { $res->write('Hello, world!'); return $res; }}

HelloWorld MiddleWareHelloWorld MiddleWare

Page 52: IPC 2015 Zend Framework 3 Reloaded

[b09][b09]

5252 / / 6161

ZEND Framework 3 AusblickZEND Framework 3 Ausblick

Page 53: IPC 2015 Zend Framework 3 Reloaded

53 / 61

Zend Framework 3Zend Framework 3

Erscheint: Ende 2015 oder Anfang 2016

Kein vollständigesDownload Archiv

GitHub (voraussichtlich)https://github.com/zendframework/zf3

Sehr loseKopplung

50+Komponenten

50+Repositories

Jede Komponente besitzt eigene Tests und

Dokumentation

Page 54: IPC 2015 Zend Framework 3 Reloaded

5454 / / 6161

ZEND Framework 3 VariantenZEND Framework 3 Varianten[B20][B20]

MVCMVC ExpressiveExpressive ApigilityApigility ZF\ConsoleZF\Console

Page 55: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

5555 / / 6161

Page 56: IPC 2015 Zend Framework 3 Reloaded

[B03][B03]

5656 / / 6161

Page 57: IPC 2015 Zend Framework 3 Reloaded

Letzte Worte von MatthewLetzte Worte von Matthew

57 / 61

[b13]

Frameworks should be an implementation detail!

Frameworks should getout of the way of your code!

ZF3 is a Movement!An end to framework silos!

Page 58: IPC 2015 Zend Framework 3 Reloaded

Fragen vom Publikum?Fragen vom Publikum?5858 / / 6161

[b21][b21]

Page 59: IPC 2015 Zend Framework 3 Reloaded

WerbungWerbung

59 / 61

[b13]

Heute: 17 Uhr

www.travello.de/#jobswww.travello.de/#jobs

Ab Frühjahr 2016:

www.ralfeggert.dewww.ralfeggert.de

[b22]

Page 60: IPC 2015 Zend Framework 3 Reloaded

DankeDankeFür Ihre / Eure AufmerksamkeitFür Ihre / Eure Aufmerksamkeit

Repository: https://github.com/RalfEggert/ipc2015-zf3-reloadedRepository: https://github.com/RalfEggert/ipc2015-zf3-reloadedSlides: http://de.slideshare.net/eggertralf/ipc2015-zf3-reloadedSlides: http://de.slideshare.net/eggertralf/ipc2015-zf3-reloaded

60 / 61

[b01][b01]

Page 61: IPC 2015 Zend Framework 3 Reloaded

BildnachweisBildnachweis

[B00] Fotos von Ralf Eggert

[B01] Matrix http://el-sobreviviente.deviantart.com/art/Matrix-98173515 von El-Sobreviviente - CC-BY http://creativecommons.org/licenses/by/3.0/

[B02] Frontiers 2011 - Day 2 https://www.flickr.com/photos/frontiersofinteraction/5866676276/ von Frontiersofinteraction - CC-BY https://creativecommons.org/licenses/by/2.0/

[B03] Imgflip Meme Generator https://imgflip.com/memegenerator/Matrix-Morpheus von imgflip.com

[B04] Horloge retour vers le futur https://commons.wikimedia.org/wiki/File:Horloge_retour_vers_le_futur.jpg von Wikimedia - https://creativecommons.org/publicdomain/zero/1.0/

[B05] Earth https://stocksnap.io/photo/DUGHLO7780 von Jay Mantri - CC0 https://creativecommons.org/publicdomain/zero/1.0/deed.de

[B06] Darts https://www.flickr.com/photos/bogdansuditu/2377844553/ von Bogdan Suditu - CC-BY https://creativecommons.org/licenses/by/2.0/

[B07] Rainbow cubes with holes https://www.flickr.com/photos/generated/6313491064/ von Jared Tarbell - CC-BY https://creativecommons.org/licenses/by/2.0/

[B08] Dutch Winter-landscape https://www.flickr.com/photos/abstract-art-fons/8956994541/ von Fons Heijnsbroek - CC-BY https://creativecommons.org/licenses/by/2.0/

[B09] Mountain View https://www.flickr.com/photos/henry_hemming/13228460095/ von Henry Hemming - CC-BY https://creativecommons.org/licenses/by/2.0/

[B10] Che Guevera https://www.flickr.com/photos/hellosputnik/2102443979/ von sputnik - CC-BY https://creativecommons.org/licenses/by/2.0/

[B11] Rubber bands https://www.flickr.com/photos/mullica/5455794041/ von Robert Brenner - CC-BY https://creativecommons.org/licenses/by/2.0/

[B12] PHP 7 Elephpant http://devzone.zend.com/6541/zendcon-php-user-groups-and-free-elephpants/ von Zend Technologies

[B13] Pocket knife collection https://www.flickr.com/photos/alexkerhead/3646629009/ von alexkerhead - CC-BY https://creativecommons.org/licenses/by/2.0/

[B14] Apothecary Cabinet https://www.flickr.com/photos/12020006@N05/8359813920/ von tootsie8664 -- CC-BY https://creativecommons.org/licenses/by/2.0/

[B15] Porsche 911 GT3RS https://www.flickr.com/photos/gfreeman23/8450589227/ von Axion23 - CC-BY https://creativecommons.org/licenses/by/2.0/

[B16] xbox-pad-for-windows-01 https://www.flickr.com/photos/futurilla/4565559935/ von Futurilla - CC-BY https://creativecommons.org/licenses/by/2.0/

[B17] Domino https://www.flickr.com/photos/barryskeates/6803420982/ von Barry Skeates - CC-BY https://creativecommons.org/licenses/by/2.0/

[B18] Guidepost https://www.flickr.com/photos/mperich/5110059854/ von Matt Perich - CC-BY https://creativecommons.org/licenses/by/2.0/

[B19]Telephone operator https://www.flickr.com/photos/kibbe_museum/5576853477/ von Kibbe Museum -- CC-BY https://creativecommons.org/licenses/by/2.0/

[B20] Jars / Gläser https://www.flickr.com/photos/manoftaste-de/9303523676/ von Christian Schnettelker / www.manoftaste.de - CC-BY https://creativecommons.org/licenses/by/2.0/

[B21] Etech05: Audience https://www.flickr.com/photos/oreilly/6648470 von James Duncan Davidson - CC-BY https://creativecommons.org/licenses/by/2.0/

[B22] Jobs https://www.flickr.com/photos/jakerust/16844967041/ von www.gotcredit.com - CC-BY https://creativecommons.org/licenses/by/2.0/

ZFrapid Logo von Moritz Liebeknecht.

Alle weiteren Screenshots und Grafiken wurden von Ralf Eggert erstellt.

61 / 61