Das Jahr 2015 steht ganz im Zeichen der erneuerten PHP-Frameworks. Auch das Zend Framework lässt sich nicht lumpen und erfindet sich neu: Der Fokus liegt auf der Implementation des PSR-7-Standards, dem Thema Middleware und einer tieferen Separierung der einzelnen Frameworkkomponenten. Als Ergänzung zum Full-Stack-Framework wird es leichtgewichtigere Alternativen geben. Erfahren Sie in dieser Session, was das Zend Framework 3 alles Neues bringt und was Sie als Entwickler bei der Migration Ihrer Zend-Framework-2-Anwendungen beachten müssen.
11. 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)
29. 29 / 61
ZendServiceManagerZendServiceManager
Container Interoperability
https://github.com/container-interop/container-interop
Einheitliche Interface
&
Wiederverwendbare
Factories
GitHub
https://github.com/zendframework/zend-servicemanager
Fast vollständig
Rückwärtskompatibel
Performance
4x schneller
Neue build() Methode
Factories per
Interface oder
Invokable
Migration-Guide:
11 DIN A4 Seiten
Service Identifier Best Practice:
class name resolution syntax
30. 30 / 61
// ArticleEntity::class mit PHP 5.5 eingeführt
return [
'service_manager' => [
'invokables' => [
BlogEntityArticleEntity::class =>
BlogEntityArticleEntity::class,
],
'factories' => [
BlogTableArticleTable::class =>
BlogTableArticleTableFactory::class,
],
],
];
Best practice: Class Name resolutionBest practice: Class Name resolution
32. 32 / 61
ZendEventManagerZendEventManager
BC Break I:
Keine Überladung der
trigger() Methoden mehr
BC Break II:
Anhängen von Listener-
Aggregaten verändert
GitHub
https://github.com/zendframework/zend-eventmanager
Performance
4x bis 15x schneller
BC Break III:
GlobalEventManager &
StaticEventManager
entfernt
BC Break IV:
SharedEventManager
Einsatz verändert
Migration-Guide:
10 DIN A4 Seiten
33. 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
35. 35 / 61
ZendMVCZendMVC
Änderungen von
ZendServiceManager
übernommen
Änderungen von
ZendEventManager
übernommen
GitHub
https://github.com/zendframework/zend-mvc
Neuer
MiddlewareListener
Bleibt im Grund
unverändert
Refaktorierung
voraussichtlich abgeschlossen:
Anfang Dezember 2015
Migration-Guide:
2 DIN A4 Seiten
(bisher)
37. 37 / 61
use ZendDiactorosRequest;
use ZendDiactorosUri;
// 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();
ZendDiactoros HTTP ClientZendDiactoros HTTP Client
38. 38 / 61
use ZendDiactorosServerRequestFactory;
use ZendDiactorosResponse;
// 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));
ZendDiactoros Server ApplikationZendDiactoros Server Applikation
39. 39 / 61
Neu: ZendStratigilityNeu: ZendStratigility
»Stratigility« comes from
»Strata«, Latin for »layer«,
and »agility«.
Applikationen auf
Basis von Middleware
umsetzen
GitHub
https://github.com/zendframework/zend-stratigility
Request
Middleware
Response
Middleware
Pipeline
Setzt auf ZendDiactoros auf
Authentication
Middleware
Error
Handler
Middleware
40. 40 / 61
use ZendStratigilityMiddlewarePipe;
// 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!');
});
ZendStratigility MiddlewareZendStratigility Middleware
41. 41 / 61
use ZendStratigilityMiddlewarePipe;
use ZendDiactorosServer;
// 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();
ZendStratigility ServerZendStratigility Server
44. 4444 // 6161
Middleware ohne und mit PipeMiddleware ohne und mit Pipe
Client MIDDLEWARE
Request Response
Client Request Response
Middleware Middleware Middleware
Client
MWPIPE Client
45. 45 / 61
ZendExpressiveZendExpressive
»Begin developing PSR-7
middleware applications
in minutes!«.
Mikroframework
für PSR-7 Middleware
Anwendungen
GitHub
https://github.com/zendframework/zend-expressive
Routing:
Aura.Router
FastRoute
ZendMvcRouter
Templating:
Plates
Twig
ZendView
Setzt auf ZendStratigility
und ZendDiactoros auf
Dependency Injection
Container:
ZendServiceManager
Pimple
Aura.Di
ErrorHandling:
Whoops
APIs
Komplexe Websites
Single Page Applikationen
Konsolenanwendungen
53. 53 / 61
Zend Framework 3Zend Framework 3
Erscheint:
Ende 2015 oder Anfang 2016
Kein vollständiges
Download Archiv
GitHub (voraussichtlich)
https://github.com/zendframework/zf3
Sehr lose
Kopplung
50+
Komponenten
50+
Repositories
Jede Komponente
besitzt eigene Tests und
Dokumentation
57. Letzte Worte von MatthewLetzte Worte von Matthew
57 / 61
[b13]
Frameworks should be
an implementation detail!
Frameworks should get
out of the way of your code!
ZF3 is a Movement!
An end to framework silos!