IPC 2015 Zend Framework 3 Reloaded

Preview:

Citation preview

Zend Framework 3Zend Framework 3ReloadedReloaded

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

1 / 61

[b01][b01]

2 / 61

www.ralfeggert.dewww.ralfeggert.de

Über michÜber mich

[B03][B03]

33 / / 6161

[B03][B03]

44 / / 6161

[B03][B03]

55 / / 6161

[B03][B03]

66 / / 6161

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

[B04]

88 / / 6161

ZF1 / ZF2 HistorieZF1 / ZF2 Historie

[B03][B03]

99 / / 6161

[B03][B03]

1010 / / 6161

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)

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

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

1414 / / 6161

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

1515 / / 6161

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

[B05][B05]

1616 / / 6161

PHP Welt heutePHP Welt heute

1717 / / 6161

PHP 7PHP 7[B12][B12]

18 / 61

ComposerComposer

19 / 61

PHP FIGPHP FIG

PSR-7PSR-4PSR-2

PSR-0

2020 / / 6161

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

[B06][B06]

2121 / / 6161

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

2222 / / 6161

Komponenten separierenKomponenten separieren[B14][B14]

2323 / / 6161

PerformancePerformance[B15][B15]

2424 / / 6161

UsabilityUsability[B16][B16]

25 / 61

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

2626 / / 6161

MigrationMigration[B18][B18]

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)

[B07][B07]

2828 / / 6161

Komponenten reloadedKomponenten 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

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

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

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

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

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

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)

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

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

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

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

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

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

[B08][B08]

4242 / / 6161

Zend\ExpressiveZend\Expressive

4343 / / 6161

MiddlewareMiddleware[B19][B19]

4444 / / 6161

Middleware ohne und mit PipeMiddleware ohne und mit Pipe

Client MIDDLEWARERequest Response

Client Request Response

Middleware Middleware Middleware

Client

MW PIPE Client

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

4646 / / 6161

Zend\Expressive Skeleton ApplicationZend\Expressive Skeleton Application

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

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

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

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

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

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

[b09][b09]

5252 / / 6161

ZEND Framework 3 AusblickZEND Framework 3 Ausblick

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

5454 / / 6161

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

MVCMVC ExpressiveExpressive ApigilityApigility ZF\ConsoleZF\Console

[B03][B03]

5555 / / 6161

[B03][B03]

5656 / / 6161

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!

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

[b21][b21]

WerbungWerbung

59 / 61

[b13]

Heute: 17 Uhr

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

Ab Frühjahr 2016:

www.ralfeggert.dewww.ralfeggert.de

[b22]

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]

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

Recommended