More Related Content Similar to IPC 2017 - Legacy-Anwendungen mit Expressive modernisieren (20) More from Ralf Eggert (20) IPC 2017 - Legacy-Anwendungen mit Expressive modernisieren2. Ralf EggertRalf Eggert
CEO Travello GmbH, ZF Trainer, Autor, Coach,CEO Travello GmbH, ZF Trainer, Autor, Coach,
PHP Entwickler & Alexa Skill EntwicklerPHP Entwickler & Alexa Skill Entwickler
4. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 44 vonvon 5353
AgendaAgenda
Teil 1: Überblick ZendExpressiveTeil 1: Überblick ZendExpressive
Teil 2: Vorbereitungen für MigrationTeil 2: Vorbereitungen für Migration
Teil 3: Migration vom ZF1 MVC zu ZF3 MiddlewareTeil 3: Migration vom ZF1 MVC zu ZF3 Middleware
Bonus-Teil 4: Migration anderer Projekte zu ZF3 MiddlewareBonus-Teil 4: Migration anderer Projekte zu ZF3 Middleware
6. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 66 vonvon 5353
Zend Framework 3Zend Framework 3
Ich bin zwei
Öltanks
FRAMEWORKS
FRAMEWORKS
7. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 77 vonvon 5353
Was ist der PSR-7?Was ist der PSR-7?
8. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 88 vonvon 5353
Was istWas ist derder PSR-15?PSR-15?
9. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 99 vonvon 5353
Zend Framework KomponentenZend Framework Komponenten
ZEND
DIACTOROS
ZENDSTRATIGILITY
ZENDEXPRESSIVE
HTTP MESSAGES /PSR-7
MIDDLEWARE / PSR-15
MIDDLEWARE
APPLICATIONS
10. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1010 vonvon 5353
ZendExpressiveZendExpressive KomponentenKomponenten
Router DI Container Template Renderer Error Handler
Aura.Router
FastRoute
ZendRouter
Weitere Router
Aura.DI
Pimple-interop
Zend
ServiceManager
Weitere
DI Container
Plates
Twig
ZendView
Weitere
Template-Engines
Whoops
Weitere
Error-Handler
11. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1111 vonvon 5353
Klassischer HTTP RequestKlassischer HTTP Request
CLIENT WEBSERVER
HTTP
REQUEST
HTTP
RESPONSE
12. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1212 vonvon 5353
Middleware-RequestMiddleware-Request
HTTP
Request
HTTP
Response
Middleware-Pipeline
13. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1313 vonvon 5353
Middleware-PipelineMiddleware-Pipeline
HTTP
Request
HTTP
Response
Routing
Middleware
Authorization
Middleware
Dispatching
Middleware
14. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1414 vonvon 5353
Middleware-AktionenMiddleware-Aktionen
HTTP
Request
HTTP
Response
Routing
Middleware
Action
Middleware
Authorization
Middleware
Dispatching
Middleware
15. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1515 vonvon 5353
Beispiele für Action-MiddlewareBeispiele für Action-Middleware
17. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1717 vonvon 5353
1. Eigener Branch für Migration1. Eigener Branch für Migration
18. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1818 vonvon 5353
2. Upgrade auf neuestes PHP 72. Upgrade auf neuestes PHP 7
19. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 1919 vonvon 5353
3. Composer installieren3. Composer installieren
20. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2020 vonvon 5353
4. Autoloading nur per Composer4. Autoloading nur per Composer
21. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2121 vonvon 5353
5. Alle Pakete (!) per Composer5. Alle Pakete (!) per Composer
22. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2222 vonvon 5353
6. Anwendung lauffähig machen6. Anwendung lauffähig machen
23. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2323 vonvon 5353
7. Expressive separat installieren7. Expressive separat installieren
24. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2424 vonvon 5353
Checkliste VorbereitungenCheckliste Vorbereitungen
Eigenen Branch für Migration einrichtenEigenen Branch für Migration einrichten
11
Upgrade auf PHP 7Upgrade auf PHP 7
22
Composer installieren (falls noch nicht geschehen)Composer installieren (falls noch nicht geschehen)
33
Autoloading ausschließlich über Composer einrichtenAutoloading ausschließlich über Composer einrichten
44
Alle Pakete und Abhängigkeiten per Composer installierenAlle Pakete und Abhängigkeiten per Composer installieren
55
Anwendung lauffähig machenAnwendung lauffähig machen
66
Expressive Skeleton in separatem Verzeichnis installierenExpressive Skeleton in separatem Verzeichnis installieren
77
26. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2626 vonvon 5353
1. Eigenes Legacy Verzeichnis1. Eigenes Legacy Verzeichnis
Vorher
application
controllers
forms
models
views
Bootstrap.php
data
cache
library
Custom
public
css
img
index.php
vendor
zendframework
composer.json
Nachher
data
cache
legacy
application
controllers
forms
models
views
Bootstrap.php
library
Custom
public
css
img
index.php
vendor
zendframework
composer.json
27. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2727 vonvon 5353
2. ZendExpressive installieren2. ZendExpressive installieren
Vorher
data
cache
legacy
application
library
public
css
img
index.php
vendor
composer.json
Nachher
config
autoload
config.php
container.php
data
cache
legacy
application
library
module
Application
public
css
img
index.php.bak (ZF1)
index.php (ZF3)
vendor
composer.json
28. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2828 vonvon 5353
2. ZendExpressive testen2. ZendExpressive testen
29. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 2929 vonvon 5353
3. Legacy Application Middleware3. Legacy Application Middleware
namespace LegacyMiddleware;
use InteropHttpServerMiddlewareDelegateInterface;
use InteropHttpServerMiddlewareMiddlewareInterface;
use PsrHttpMessageServerRequestInterface;
use ZendDiactorosResponseHtmlResponse;
use ZendExpressiveRouterRouteResult;
class LegacyApplicationMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, DelegateInterface $delegate)
{
$result = $request->getAttribute(RouteResult::class, false);
if ($result instanceof RouteResult) {
return $delegate->process($request);
}
ob_start();
$application = new Zend_Application(
APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap();
$application->run();
$output = ob_get_contents();
ob_end_clean();
return new HtmlResponse($output);
}
}
30. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3030 vonvon 5353
3. ZF3 Startseite testen3. ZF3 Startseite testen
31. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3131 vonvon 5353
3. ZF1 Anwendung testen3. ZF1 Anwendung testen
32. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3232 vonvon 5353
3. ZF3 Home Route ausblenden3. ZF3 Home Route ausblenden
33. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3333 vonvon 5353
4. Neue Test-Aktion4. Neue Test-Aktion
Vorher
config
data
legacy
module
Application
src
Action
HomePageAction.php
Router
RouterDelegatorFactory.php
templates
application
home-page.phtml
public
vendor
composer.json
Nachher
config
data
legacy
module
Application
src
Action
HomePageAction.php
ZF3TestAction.php
Router
RouterDelegatorFactory.php
templates
application
home-page.phtml
zf3-test.phtml
public
vendor
composer.json
34. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3434 vonvon 5353
4. ZF3 Aktion testen4. ZF3 Aktion testen
35. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3535 vonvon 5353
4. Design anpassen4. Design anpassen
36. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3636 vonvon 5353
4. ZF1 Anwendung testen4. ZF1 Anwendung testen
37. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3737 vonvon 5353
Wichtiger Meilenstein erreichtWichtiger Meilenstein erreicht
38. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3838 vonvon 5353
Wichtiger Meilenstein erreichtWichtiger Meilenstein erreicht
ZF1 und ZF3 laufen parallel
39. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 3939 vonvon 5353
Wichtiger Meilenstein erreichtWichtiger Meilenstein erreicht
ZF1 und ZF3 laufen parallel
Alte ZF1 Anwendung kann weiter gewartet werden
40. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4040 vonvon 5353
Wichtiger Meilenstein erreichtWichtiger Meilenstein erreicht
ZF1 und ZF3 laufen parallel
Alte ZF1 Anwendung kann weiter gewartet werden
Neue Features können in ZF3 implementiert werden
41. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4141 vonvon 5353
Wichtiger Meilenstein erreichtWichtiger Meilenstein erreicht
ZF1 und ZF3 laufen parallel
Alte ZF1 Anwendung kann weiter gewartet werden
Neue Features können in ZF3 implementiert werden
ZF1 und ZF3 nutzen dasselbe Design
42. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4242 vonvon 5353
5. Ressourcen & Plugins portieren5. Ressourcen & Plugins portieren
Controller
Plugins
Ressourcen
Konfiguration
Factories
Middleware
Pipeline
ZF1 ZF3
43. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4343 vonvon 5353
5. Ressourcen & Plugins portieren5. Ressourcen & Plugins portieren
Controller
Plugins
Ressourcen
Konfiguration
Factories
Middleware
Pipeline
ZF1 ZF3
Bootstrap
Datei
44. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4444 vonvon 5353
5. Ressourcen & Plugins portieren5. Ressourcen & Plugins portieren
Zend_ApplicationZend_Application Ressourcen nach ZF3 portierenRessourcen nach ZF3 portieren
Zend_ControllerZend_Controller Plugins nach ZF3 portierenPlugins nach ZF3 portieren
ZF1 Bootstrap Klasse nicht vergessenZF1 Bootstrap Klasse nicht vergessen
Portierung in Konfigurationsdateien und Middleware PipelinePortierung in Konfigurationsdateien und Middleware Pipeline
Beispiele: Config für Datenbanken, Caching, Mailsettings, etc.Beispiele: Config für Datenbanken, Caching, Mailsettings, etc.
Plugins: Authentifizierung, Autorisierung, Internationalisierung, etc.Plugins: Authentifizierung, Autorisierung, Internationalisierung, etc.
Anwendung lauffähig machenAnwendung lauffähig machen
45. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4545 vonvon 5353
6. Aktionen migrieren6. Aktionen migrieren
Customer
Controller
Create
Customer
Action
Update
Customer
Action
Delete
Customer
Action
ZF1 ZF3
46. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4646 vonvon 5353
6. Aktionen migrieren6. Aktionen migrieren
Erst nur eine Controller Action migrierenErst nur eine Controller Action migrieren
Routing für Aktion in ZF3 Expressive definierenRouting für Aktion in ZF3 Expressive definieren
Action Middleware erstellen mit Code aus Controller ActionAction Middleware erstellen mit Code aus Controller Action
Template aus ZF1 Anwendung in ZF3 Anwendung schiebenTemplate aus ZF1 Anwendung in ZF3 Anwendung schieben
Aktion unter ZF3 lauffähig bekommen und ZF1 aufräumenAktion unter ZF3 lauffähig bekommen und ZF1 aufräumen
Mit allen anderen Aktionen fortfahrenMit allen anderen Aktionen fortfahren
Anwendung lauffähig machenAnwendung lauffähig machen
47. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4747 vonvon 5353
7. ZF1 Komponenten migrieren7. ZF1 Komponenten migrieren
Zend_Form
Zend_Db
Zend
ServiceManager
ZendDb
ZendForm
ZF1 ZF3
Zend_Registry
48. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4848 vonvon 5353
7. ZF1 Komponenten migrieren7. ZF1 Komponenten migrieren
ZF1 Komponenten schrittweise durch ZF3 Komponenten austauschenZF1 Komponenten schrittweise durch ZF3 Komponenten austauschen
Zend_RegistryZend_Registry →→ ZendServiceManagerZendServiceManager (Dependency Injection)(Dependency Injection)
Zend_DbZend_Db →→ ZendDbZendDb (Modelklassen und Datenbankanbindung)(Modelklassen und Datenbankanbindung)
Zend_FormZend_Form →→ ZendFormZendForm (Formulare)(Formulare)
Alle weitere ZF1 Komponenten durch ZF3 Komponenten austauschenAlle weitere ZF1 Komponenten durch ZF3 Komponenten austauschen
Alte Legacy Anwendung komplett entfernenAlte Legacy Anwendung komplett entfernen
Anwendung lauffähig machenAnwendung lauffähig machen
49. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 4949 vonvon 5353
Checkliste ZF1 MVC ZF3 MW→Checkliste ZF1 MVC ZF3 MW→
Legacy Anwendung in eigenes Verzeichnis schiebenLegacy Anwendung in eigenes Verzeichnis schieben
11
ZendExpressiveZendExpressive manuell installierenmanuell installieren
22
Middleware für Legacy Anwendung einrichtenMiddleware für Legacy Anwendung einrichten
33
Test-Aktion mit neuer Route einrichten und Design anpassenTest-Aktion mit neuer Route einrichten und Design anpassen
44
ZF1 Application Ressourcen & MVC Plugins zum ZF3 portierenZF1 Application Ressourcen & MVC Plugins zum ZF3 portieren
55
Controller-Aktionen zu Middleware-Aktionen migrierenController-Aktionen zu Middleware-Aktionen migrieren
66
Restliche ZF1 Komponenten migrierenRestliche ZF1 Komponenten migrieren
77
51. IPC 2017 MünchenIPC 2017 MünchenRalf EggertRalf Eggert 5151 vonvon 5353
Checkliste Custom ZF3 MW→Checkliste Custom ZF3 MW→
Legacy Anwendung in eigenes Verzeichnis schiebenLegacy Anwendung in eigenes Verzeichnis schieben
11
ZendExpressiveZendExpressive manuell installierenmanuell installieren
22
Middleware für Legacy Anwendung einrichtenMiddleware für Legacy Anwendung einrichten
33
Test-Aktion mit neuer Route einrichten und Design anpassenTest-Aktion mit neuer Route einrichten und Design anpassen
44
Konfigurationen und »Objekte« portierenKonfigurationen und »Objekte« portieren
55
Seiten zu Middleware-Aktionen migrierenSeiten zu Middleware-Aktionen migrieren
66
Restliche Komponenten ersetzenRestliche Komponenten ersetzen
77