Post on 16-Apr-2017
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