SlideShare una empresa de Scribd logo
1 de 64
Descargar para leer sin conexión
9 Tipps für die Modernisierung9 Tipps für die Modernisierung
von PHP-Anwendungenvon PHP-Anwendungen
Ralf EggertRalf Eggert
CEO Travello GmbH, PHP Entwickler,CEO Travello GmbH, PHP Entwickler,
Zend Framework Trainer, Autor & Coach sowieZend Framework Trainer, Autor & Coach sowie
Amazon Alexa Skill EntwicklerAmazon Alexa Skill Entwickler
Warum Modernisierung?Warum Modernisierung?
Ralf EggertRalf Eggert 44 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Legacy ApplicationLegacy Application
»Der Begriff Altsystem (englisch
legacy system) bezeichnet in der
Informatik eine etablierte,
historisch gewachsene
Anwendung im Bereich
Unternehmenssoftware.
Legacy ist hierbei das englische
Wort für Vermächtnis,
Hinterlassenschaft, Erbschaft, auch
Altlast.«
Wikipedia Deutschland
»The app was written some time
ago, its original authors moved on
taking knowledge with them (lost
knowledge).
Subsequent authors changed the
application based on insufficient /
lost knowledge, introducing bugs
and de-stabilizing it.
The app is now brittle, and
people are reluctant to change it for
fear of breaking it.«
Phil Murphy
Forrester Research, Inc.
»The main thing that distinguishes
legacy code from non-legacy code is
tests, or rather a lack of tests.«
Michael Feathers
Autor von
»Working Effectively with Legacy Code«
»Legacy Applications sind
historisch gewachsen und
niemand traut sich mehr,
Änderungen im Großen oder
Kleinen vorzunehmen.
Neue Features werden nur
langsam oder gar nicht
implementiert.
Sollten Tests vorhanden sein, geben
diese auch keine Sicherheit.«
Ralf Eggert
Travello GmbH
Wer betreut Legacy Applications?Wer betreut Legacy Applications?
Ralf EggertRalf Eggert 1010 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 1: Rewrite vs. RefactoringTipp 1: Rewrite vs. Refactoring
Ralf EggertRalf Eggert 1111 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
RewriteRewrite
Ralf EggertRalf Eggert 1212 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
RefactoringRefactoring
Rewriting oder Refactoring?Rewriting oder Refactoring?
»Netscape made the single worst
strategic mistake that any software
company can make:
They decided to rewrite the code
from scratch.
This one decision cost Netscape
3 years.«
Joel Spolsky
Stack Overflow / Trello
»Mit seiner langen Entwicklungszeit
von 14 Jahren und immer wieder
verschobenen
Veröffentlichungsterminen war es
lange eines der bekanntesten
Vaporware-Produkte.«
Wikipedia Deutschland
»Für ein eigenes Projekt haben in
der Vergangenheit zwei mal einen
Rewrite gestartet. Zweimal wurde
der Rewrite abgebrochen.
Jetzt machen wir ein
schrittweises Refactoring.«
Ralf Eggert
Travello GmbH
Ralf EggertRalf Eggert 1717 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Vergleich Rewrite und Refactoring
Rewrite Refactoring
Ressourcen aufteilen oder verdoppeln ✔ -
Entwicklerwissen in Teams splitten ✔ -
Verlust von Marktanteilen möglich ✔ -
Ausfallzeiten bei Relaunch möglich ✔ -
Features doppelt implementieren ✔ -
Bessere Architektur nicht garantiert ✔ -
Neue Technologien einführen ✔ ( )✔
Ralf EggertRalf Eggert 1818 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 2: Schrittweises RefactoringTipp 2: Schrittweises Refactoring
Ralf EggertRalf Eggert 1919 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
SelbstdisziplinSelbstdisziplin
Ralf EggertRalf Eggert 2020 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
ChaosChaos
Ralf EggertRalf Eggert 2121 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Schritt 1: Composer einführen
Schritt 2: Dependency Injection einführen
Schritt 3: Controller konsolidieren
Schritt 4: SQL Abfragen abstrahieren
usw.
Schritte nacheinander ausführen
Ralf EggertRalf Eggert 2222 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 3: TestsTipp 3: Tests
Ralf EggertRalf Eggert 2323 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Das Untestbare testen?Das Untestbare testen?
Ralf EggertRalf Eggert 2424 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Unit Tests
Testpyramide nach Mike Cohn
Mike Cohn
Service Tests
UI
Tests
Ralf EggertRalf Eggert 2525 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Testpyramide Variante
Unit Tests
Integration Tests
End-to-End
Tests
Ralf EggertRalf Eggert 2626 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Testpyramide Legacy Applications
Unit Tests
Integration Tests
End-to-End
Tests
Ralf Eggert
Travello GmbH
Ralf EggertRalf Eggert 2727 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
End-to-End Tests
namespace EndToEndTest;
use PHPUnitFrameworkTestCase;
class RegistrationTest extends TestCase
{
/**
* @backupGlobals
*/
public function testRegister()
{
$_POST = [
'user_name' => 'Ralf Eggert',
'user_email' => 'ralf@travello.com',
'submit_user_registration' => 'submit_user_registration',
];
require __DIR__ . '/../public/index.php';
$newUser = Legacy_Application_UsersModel::getUserByEmail('ralf@travello.com');
$this->assertEquals($_POST['user_name'], $newUser['name']);
$this->assertEquals($_POST['user_email'], $newUser['email']);
}
}
Ralf EggertRalf Eggert 2828 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 4: ComposerTipp 4: Composer
Ralf EggertRalf Eggert 2929 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Composer? Ernsthaft?Composer? Ernsthaft?
Wer setzt Composer zu 100% ein?Wer setzt Composer zu 100% ein?
Composer einführen
Immer alle Abhängigkeiten abbilden
(keine Ausnahmen).
Zuerst bisherige Versionen
verwenden und Autoloading für
komplette Anwendung nutzen.
Wenn Anwendung läuft, die
neuesten Versionen der
Abhängigkeiten verwenden.
https://getcomposer.org
Kein Composer Paket vorhanden?
Gepatchte Libraries?
Anderen Quatsch gemacht?
SATIS
Ralf EggertRalf Eggert 3333 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Kein Composer? Es ist 2017!Kein Composer? Es ist 2017!
Ralf EggertRalf Eggert 3434 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 5: Tech-Stack aktualisierenTipp 5: Tech-Stack aktualisieren
Den gesamten Tech-Stack
auf den neuesten Stand
bringen!
PHP Frameworks:
Problemfall bei enger
Kopplung
Ralf EggertRalf Eggert 3737 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 6: Legacy WeicheTipp 6: Legacy Weiche
Legacy
Anwendung
Moderne
Anwendung
»Es ist unvermeidlich, dass manche
Bereiche bei parallelen
Anwendungen doppelt gepflegt
werden müssen.
Dies könnten zugrundeliegende
Layouts sein, aber vor allem
Konfigurationen für Legacy und die
moderne Anwendung.
Halten Sie diese doppelten Bereiche
aber so gering wie möglich.«
Ralf Eggert
Travello GmbH
Ralf EggertRalf Eggert 4040 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Apache 2 .htaccess Weiche
RewriteEngine On
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
// new features for modern application
RewriteRule ^new_user modern.php [NC,L]
RewriteRule ^new_feature modern.php [NC,L]
RewriteRule ^index.php modern.php [NC,L]
// no new stuff? let the legacy application handle it
RewriteRule ^.*$ legacy.php [NC,L]
Ralf EggertRalf Eggert 4141 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
ZendExpressive Middleware I
namespace LegacyMiddleware;
use InteropHttpServerMiddlewareDelegateInterface;
use InteropHttpServerMiddlewareMiddlewareInterface;
use PsrHttpMessageServerRequestInterface as Request;
use ZendExpressiveRouterRouteResult;
class LegacyApplicationMiddleware implements MiddlewareInterface
{
public function process(
Request $request, DelegateInterface $delegate
) {
$result = $request->getAttribute(RouteResult::class, false);
if ($result instanceof RouteResult) {
return $delegate->process($request);
}
return $this->handleLegacy();
}
/* ... */
}
Ralf EggertRalf Eggert 4242 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
ZendExpressive Middleware II
namespace LegacyMiddleware;
use ZendDiactorosResponseHtmlResponse;
use Zend_Application;
class LegacyApplicationMiddleware implements MiddlewareInterface
{
public function handleLegacy()
{
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);
}
}
Vorgehen?
Controller / Aktionen
Formulare
Datenbank
Domain Layer
Templates / View
ACHTUNG:
Unbedingt dabei
Schritt 2 beachten!
Ralf EggertRalf Eggert 4545 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 7: Dependency InjectionTipp 7: Dependency Injection
Ralf EggertRalf Eggert 4646 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Dependency Injection Pattern
Class
PostService
instanziiert
Class
PostItem
Class
PostService
wird injiziert
Class
PostItem
Harte Abhängigkeit Injizierte Abhängigkeit
Interface
ItemInterfaceimplementiert implementiert
Ralf EggertRalf Eggert 4747 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
DI Codebeispiel
// harte Abhängigkeit
class PostService
{
public __construct()
{
$this->item = new PostItem();
}
}
// Dependency Injection per Setter
class PostService
{
public setItem(PostItem $item)
{
$this->item = $item;
}
}
// Dependency Injection per Konstruktor
class PostService
{
public __construct(
PostItem $item
) {
$this->item = $item;
}
}
// Dependency Injection mit Interface
class PostService
{
public __construct(
ItemInterface $item
) {
$this->item = $item;
}
}
Dependency
Injection
Vorteile
Wartbarkeit erhöhen
Testbarkeit erhöhen
Abhängigkeiten sichtbar
Code übersichtlicher
Klassen entkoppeln
Wann keine
Dependency
Injection?
Methode soll Objekt
instanzieren
z.B. Entitäten oder
Factories
Auswahl
Dependency
Injection
Container
Aura.di
Auryn
Pimple
Symfony DI
ZendServicemanager
PHP-DI 5
DISCO
Acclimate
Ralf EggertRalf Eggert 5151 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 8: CodestrukturTipp 8: Codestruktur
Module
Klassen
Methoden
Templates
Seiten
Aufteilen
Zusammenführen
Entkoppeln
Strukturieren
Verkleinern
Abstrahieren
Wiederverwenden
Refaktorieren
Sonderfall
Datenbanken
&
»Model«
Hart kodiertes SQL
Models an DB koppeln
SQL Injections
verhindern
Models von DB
entkoppeln
DB Abstraktion
ACHTUNG:
Auch hier
Schritt 2 beachten!
Ralf EggertRalf Eggert 5555 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Tipp 9: Last Boy Scout RegelTipp 9: Last Boy Scout Regel
Ralf EggertRalf Eggert 5656 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Nein, nicht Bruce!Nein, nicht Bruce!
The Boy Scouts have a rule: »Always
leave the campground cleaner than
you found it.«
What if we followed a similar rule in
our code: »Always check a module
in cleaner than when you checked
it out.«
Robert C. Martin
(Uncle Bob)
Opportunistic Refactoring
(last boy-scout rule)
»What this means is that at any time
someone sees some code that isn't
as clear as it should be, they should
take the opportunity to fix it right
there and then - or at least within a
few minutes.«
Martin Fowler
»Wenn du an einer Methode oder
Klasse arbeitest, investiere maximal
15 Minuten, um den Code zu
verbessern.«
Ralf Eggert
Travello GmbH
ZusammenfassungZusammenfassung
1. Refactoring1. Refactoring 2. Schritt für Schritt2. Schritt für Schritt 3. End-to-End Tests3. End-to-End Tests
4. Composer4. Composer 5. Tech-Stack Update5. Tech-Stack Update 6. Legacy Weiche6. Legacy Weiche
7. Dependency Injection7. Dependency Injection 8. Codestruktur8. Codestruktur 9 . Last Boy Scout Regel9 . Last Boy Scout Regel
Fragen?Fragen?
Danke!Danke!
Fragen an ralf@travello.deFragen an ralf@travello.de
Ralf EggertRalf Eggert 6464 vonvon 6464
9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen
Bildnachweis
Ralf Steinberger
Abandoned factory building
in Northern Italy.
(CC BY 2.0)
Chris Potter
3D Home Inspection Checklist
(CC BY 2.0)
Swaroop C H
Green fields
(CC BY-SA 2.0)
Aapo Haapanen
Renovation
(CC BY 2.0)
Sunjo
Feuerwerk
(CC BY-SA 2.0)
Frederik Magle Music
Conductor - Frederik Magle
conducting a symphony orchestra 9
(CC BY 2.0)
Rebecca Siegel
Stack
(CC BY-SA 2.0)
Kecko
St. Margrethen - Switzerland
(CC BY 2.0)
slgckgc
September 2012 Court of Honor
(CC BY 2.0)
Daisuke tashiro
Long long stairs
(CC BY-SA 2.0)
Tomas Sobek
Walking down to Rock Burn Valley
(CC BY 2.0)
Mike Mozart
Mess
(CC BY 2.0)
Adrian Sampson
Cable closet
(CC BY 2.0)
Thomas Claveirole
Gears
(CC BY-SA 2.0)
Eduard Anton
Structure
(CC BY 2.0)
Rohit Chhiber
Snotty doubt
(CC BY 2.0)

Más contenido relacionado

La actualidad más candente

La actualidad más candente (12)

Kaps - Continuous Deployment Roadmap
Kaps - Continuous Deployment RoadmapKaps - Continuous Deployment Roadmap
Kaps - Continuous Deployment Roadmap
 
Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...
Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...
Legacy-Software-Refactoring - Zielsetzungen für ein erfolgreiches Refactoring...
 
Dream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio ExtensionsDream-Team: Roslyn & Visual Studio Extensions
Dream-Team: Roslyn & Visual Studio Extensions
 
Dev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei TechnosoftDev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei Technosoft
 
Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...
Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...
Effiziente Entwicklungsprozesse mit Git, EGit und Gerrit - Intland Technology...
 
Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?Magdeburger Developer Days 2018 - Warum warten auf die IDE?
Magdeburger Developer Days 2018 - Warum warten auf die IDE?
 
.NET zu .NET Core
.NET zu .NET Core.NET zu .NET Core
.NET zu .NET Core
 
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge UnternehmenGewinnung von OPEN SOURCE Techniken für junge Unternehmen
Gewinnung von OPEN SOURCE Techniken für junge Unternehmen
 
Cloud Native Migration: Wie IT-Landschaften ihren Weg auf eine Cloud-Native-P...
Cloud Native Migration: Wie IT-Landschaften ihren Weg auf eine Cloud-Native-P...Cloud Native Migration: Wie IT-Landschaften ihren Weg auf eine Cloud-Native-P...
Cloud Native Migration: Wie IT-Landschaften ihren Weg auf eine Cloud-Native-P...
 
BASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio ExtensionsBASTA! 2016 - Roslyn & Visual Studio Extensions
BASTA! 2016 - Roslyn & Visual Studio Extensions
 
Kaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes seinKaps - Es muss nicht immer Kubernetes sein
Kaps - Es muss nicht immer Kubernetes sein
 
PHP auf IBM Plattformen
PHP auf IBM PlattformenPHP auf IBM Plattformen
PHP auf IBM Plattformen
 

Similar a 9 Tipps für die Modernisierung von PHP-Anwendungen

FMK2015: The Power of JavaScript by Marcel Moré
FMK2015: The Power of JavaScript by Marcel MoréFMK2015: The Power of JavaScript by Marcel Moré
FMK2015: The Power of JavaScript by Marcel Moré
Verein FM Konferenz
 

Similar a 9 Tipps für die Modernisierung von PHP-Anwendungen (20)

IPC2017SE - Zend\Expressive Workshop
IPC2017SE - Zend\Expressive WorkshopIPC2017SE - Zend\Expressive Workshop
IPC2017SE - Zend\Expressive Workshop
 
Cross Plattform Apps mit Visual Studio und Apache Cordova
Cross Plattform Apps mit Visual Studio und Apache CordovaCross Plattform Apps mit Visual Studio und Apache Cordova
Cross Plattform Apps mit Visual Studio und Apache Cordova
 
Citrix Day 2014: Panalpina - global und doch nah
Citrix Day 2014: Panalpina - global und doch nahCitrix Day 2014: Panalpina - global und doch nah
Citrix Day 2014: Panalpina - global und doch nah
 
Legacy php - Sanieren oder Ablösen?
Legacy php  - Sanieren oder Ablösen?Legacy php  - Sanieren oder Ablösen?
Legacy php - Sanieren oder Ablösen?
 
Drupal Basics (7-8) Vortrag (01.2016)
Drupal Basics (7-8) Vortrag (01.2016)Drupal Basics (7-8) Vortrag (01.2016)
Drupal Basics (7-8) Vortrag (01.2016)
 
MT AG Rapid Application Development mit APEX 5 (Important: latest version on ...
MT AG Rapid Application Development mit APEX 5 (Important: latest version on ...MT AG Rapid Application Development mit APEX 5 (Important: latest version on ...
MT AG Rapid Application Development mit APEX 5 (Important: latest version on ...
 
PHPblue LOS!NRW
PHPblue LOS!NRWPHPblue LOS!NRW
PHPblue LOS!NRW
 
fn project serverless computing
fn project serverless computingfn project serverless computing
fn project serverless computing
 
Apache Solr Revisited 2015
Apache Solr Revisited 2015Apache Solr Revisited 2015
Apache Solr Revisited 2015
 
APEX 5.0, und sonst?
APEX 5.0, und sonst?APEX 5.0, und sonst?
APEX 5.0, und sonst?
 
10 Stunden / 5 Massnahmen: Sicherheit einer Web App erhöhen
10 Stunden / 5 Massnahmen: Sicherheit einer Web App erhöhen10 Stunden / 5 Massnahmen: Sicherheit einer Web App erhöhen
10 Stunden / 5 Massnahmen: Sicherheit einer Web App erhöhen
 
Testing TYPO3 Flow Applications with Behat
Testing TYPO3 Flow Applications with BehatTesting TYPO3 Flow Applications with Behat
Testing TYPO3 Flow Applications with Behat
 
FMK2015: The Power of JavaScript by Marcel Moré
FMK2015: The Power of JavaScript by Marcel MoréFMK2015: The Power of JavaScript by Marcel Moré
FMK2015: The Power of JavaScript by Marcel Moré
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
Framework Auswahlkriterin, PHP Unconference 2009 in Hamburg
 
IPC 2017 - Legacy-Anwendungen mit Expressive modernisieren
IPC 2017 - Legacy-Anwendungen mit Expressive modernisierenIPC 2017 - Legacy-Anwendungen mit Expressive modernisieren
IPC 2017 - Legacy-Anwendungen mit Expressive modernisieren
 
Software-Tests in PHP-Anwendungen
Software-Tests in PHP-AnwendungenSoftware-Tests in PHP-Anwendungen
Software-Tests in PHP-Anwendungen
 
Eine Stunde was mit Api First!
Eine Stunde was mit Api First!Eine Stunde was mit Api First!
Eine Stunde was mit Api First!
 
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
 
PHP5 und Oracle
PHP5 und OraclePHP5 und Oracle
PHP5 und Oracle
 

Más de Ralf Eggert

Más de Ralf Eggert (20)

ChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heuteChatGPT: unser täglich' Bot gib uns heute
ChatGPT: unser täglich' Bot gib uns heute
 
Der ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 EditionDer ultimative PHP Framework Vergleich 2023 Edition
Der ultimative PHP Framework Vergleich 2023 Edition
 
PHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickelnPHP Module als Rundum-Sorglos-Pakete entwickeln
PHP Module als Rundum-Sorglos-Pakete entwickeln
 
Alexa, what's next?
Alexa, what's next?Alexa, what's next?
Alexa, what's next?
 
Alexa, wohin geht die Reise
Alexa, wohin geht die ReiseAlexa, wohin geht die Reise
Alexa, wohin geht die Reise
 
8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface Meetup8. Hamburg Voice Interface Meetup
8. Hamburg Voice Interface Meetup
 
Welcome Bixby
Welcome BixbyWelcome Bixby
Welcome Bixby
 
Alexa Skill Maintenance
Alexa Skill MaintenanceAlexa Skill Maintenance
Alexa Skill Maintenance
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu Laminas
 
Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?Alexa Skills und PHP? Passt das zusammen?
Alexa Skills und PHP? Passt das zusammen?
 
Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100Mit Jovo von 0 auf 100
Mit Jovo von 0 auf 100
 
Vom Zend Framework zu Laminas
Vom Zend Framework zu LaminasVom Zend Framework zu Laminas
Vom Zend Framework zu Laminas
 
Alexa for Hospitality
Alexa for HospitalityAlexa for Hospitality
Alexa for Hospitality
 
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
Alexa, lass uns Geld verdienen – fünf Geschäftsmodelle, die wirklich funktion...
 
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche SprachanwendungenFortgeschrittene Techniken für erfolgreiche Sprachanwendungen
Fortgeschrittene Techniken für erfolgreiche Sprachanwendungen
 
Die sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice ProjekteDie sieben Projektphasen für Voice Projekte
Die sieben Projektphasen für Voice Projekte
 
Künstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und WirklichkeitKünstliche Intelligenz – Traum und Wirklichkeit
Künstliche Intelligenz – Traum und Wirklichkeit
 
Multi-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon AlexaMulti-Modal Voice Development with Amazon Alexa
Multi-Modal Voice Development with Amazon Alexa
 
Mein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein BackendMein Haus, mein Auto, mein Backend
Mein Haus, mein Auto, mein Backend
 
Zend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next GenerationZend/Expressive 3 – The Next Generation
Zend/Expressive 3 – The Next Generation
 

9 Tipps für die Modernisierung von PHP-Anwendungen

  • 1. 9 Tipps für die Modernisierung9 Tipps für die Modernisierung von PHP-Anwendungenvon PHP-Anwendungen
  • 2. Ralf EggertRalf Eggert CEO Travello GmbH, PHP Entwickler,CEO Travello GmbH, PHP Entwickler, Zend Framework Trainer, Autor & Coach sowieZend Framework Trainer, Autor & Coach sowie Amazon Alexa Skill EntwicklerAmazon Alexa Skill Entwickler
  • 4. Ralf EggertRalf Eggert 44 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Legacy ApplicationLegacy Application
  • 5. »Der Begriff Altsystem (englisch legacy system) bezeichnet in der Informatik eine etablierte, historisch gewachsene Anwendung im Bereich Unternehmenssoftware. Legacy ist hierbei das englische Wort für Vermächtnis, Hinterlassenschaft, Erbschaft, auch Altlast.« Wikipedia Deutschland
  • 6. »The app was written some time ago, its original authors moved on taking knowledge with them (lost knowledge). Subsequent authors changed the application based on insufficient / lost knowledge, introducing bugs and de-stabilizing it. The app is now brittle, and people are reluctant to change it for fear of breaking it.« Phil Murphy Forrester Research, Inc.
  • 7. »The main thing that distinguishes legacy code from non-legacy code is tests, or rather a lack of tests.« Michael Feathers Autor von »Working Effectively with Legacy Code«
  • 8. »Legacy Applications sind historisch gewachsen und niemand traut sich mehr, Änderungen im Großen oder Kleinen vorzunehmen. Neue Features werden nur langsam oder gar nicht implementiert. Sollten Tests vorhanden sein, geben diese auch keine Sicherheit.« Ralf Eggert Travello GmbH
  • 9. Wer betreut Legacy Applications?Wer betreut Legacy Applications?
  • 10. Ralf EggertRalf Eggert 1010 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 1: Rewrite vs. RefactoringTipp 1: Rewrite vs. Refactoring
  • 11. Ralf EggertRalf Eggert 1111 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen RewriteRewrite
  • 12. Ralf EggertRalf Eggert 1212 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen RefactoringRefactoring
  • 14. »Netscape made the single worst strategic mistake that any software company can make: They decided to rewrite the code from scratch. This one decision cost Netscape 3 years.« Joel Spolsky Stack Overflow / Trello
  • 15. »Mit seiner langen Entwicklungszeit von 14 Jahren und immer wieder verschobenen Veröffentlichungsterminen war es lange eines der bekanntesten Vaporware-Produkte.« Wikipedia Deutschland
  • 16. »Für ein eigenes Projekt haben in der Vergangenheit zwei mal einen Rewrite gestartet. Zweimal wurde der Rewrite abgebrochen. Jetzt machen wir ein schrittweises Refactoring.« Ralf Eggert Travello GmbH
  • 17. Ralf EggertRalf Eggert 1717 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Vergleich Rewrite und Refactoring Rewrite Refactoring Ressourcen aufteilen oder verdoppeln ✔ - Entwicklerwissen in Teams splitten ✔ - Verlust von Marktanteilen möglich ✔ - Ausfallzeiten bei Relaunch möglich ✔ - Features doppelt implementieren ✔ - Bessere Architektur nicht garantiert ✔ - Neue Technologien einführen ✔ ( )✔
  • 18. Ralf EggertRalf Eggert 1818 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 2: Schrittweises RefactoringTipp 2: Schrittweises Refactoring
  • 19. Ralf EggertRalf Eggert 1919 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen SelbstdisziplinSelbstdisziplin
  • 20. Ralf EggertRalf Eggert 2020 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen ChaosChaos
  • 21. Ralf EggertRalf Eggert 2121 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Schritt 1: Composer einführen Schritt 2: Dependency Injection einführen Schritt 3: Controller konsolidieren Schritt 4: SQL Abfragen abstrahieren usw. Schritte nacheinander ausführen
  • 22. Ralf EggertRalf Eggert 2222 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 3: TestsTipp 3: Tests
  • 23. Ralf EggertRalf Eggert 2323 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Das Untestbare testen?Das Untestbare testen?
  • 24. Ralf EggertRalf Eggert 2424 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Unit Tests Testpyramide nach Mike Cohn Mike Cohn Service Tests UI Tests
  • 25. Ralf EggertRalf Eggert 2525 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Testpyramide Variante Unit Tests Integration Tests End-to-End Tests
  • 26. Ralf EggertRalf Eggert 2626 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Testpyramide Legacy Applications Unit Tests Integration Tests End-to-End Tests Ralf Eggert Travello GmbH
  • 27. Ralf EggertRalf Eggert 2727 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen End-to-End Tests namespace EndToEndTest; use PHPUnitFrameworkTestCase; class RegistrationTest extends TestCase { /** * @backupGlobals */ public function testRegister() { $_POST = [ 'user_name' => 'Ralf Eggert', 'user_email' => 'ralf@travello.com', 'submit_user_registration' => 'submit_user_registration', ]; require __DIR__ . '/../public/index.php'; $newUser = Legacy_Application_UsersModel::getUserByEmail('ralf@travello.com'); $this->assertEquals($_POST['user_name'], $newUser['name']); $this->assertEquals($_POST['user_email'], $newUser['email']); } }
  • 28. Ralf EggertRalf Eggert 2828 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 4: ComposerTipp 4: Composer
  • 29. Ralf EggertRalf Eggert 2929 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Composer? Ernsthaft?Composer? Ernsthaft?
  • 30. Wer setzt Composer zu 100% ein?Wer setzt Composer zu 100% ein?
  • 31. Composer einführen Immer alle Abhängigkeiten abbilden (keine Ausnahmen). Zuerst bisherige Versionen verwenden und Autoloading für komplette Anwendung nutzen. Wenn Anwendung läuft, die neuesten Versionen der Abhängigkeiten verwenden. https://getcomposer.org
  • 32. Kein Composer Paket vorhanden? Gepatchte Libraries? Anderen Quatsch gemacht? SATIS
  • 33. Ralf EggertRalf Eggert 3333 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Kein Composer? Es ist 2017!Kein Composer? Es ist 2017!
  • 34. Ralf EggertRalf Eggert 3434 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 5: Tech-Stack aktualisierenTipp 5: Tech-Stack aktualisieren
  • 35. Den gesamten Tech-Stack auf den neuesten Stand bringen!
  • 37. Ralf EggertRalf Eggert 3737 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 6: Legacy WeicheTipp 6: Legacy Weiche
  • 39. »Es ist unvermeidlich, dass manche Bereiche bei parallelen Anwendungen doppelt gepflegt werden müssen. Dies könnten zugrundeliegende Layouts sein, aber vor allem Konfigurationen für Legacy und die moderne Anwendung. Halten Sie diese doppelten Bereiche aber so gering wie möglich.« Ralf Eggert Travello GmbH
  • 40. Ralf EggertRalf Eggert 4040 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Apache 2 .htaccess Weiche RewriteEngine On RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L] RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] // new features for modern application RewriteRule ^new_user modern.php [NC,L] RewriteRule ^new_feature modern.php [NC,L] RewriteRule ^index.php modern.php [NC,L] // no new stuff? let the legacy application handle it RewriteRule ^.*$ legacy.php [NC,L]
  • 41. Ralf EggertRalf Eggert 4141 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen ZendExpressive Middleware I namespace LegacyMiddleware; use InteropHttpServerMiddlewareDelegateInterface; use InteropHttpServerMiddlewareMiddlewareInterface; use PsrHttpMessageServerRequestInterface as Request; use ZendExpressiveRouterRouteResult; class LegacyApplicationMiddleware implements MiddlewareInterface { public function process( Request $request, DelegateInterface $delegate ) { $result = $request->getAttribute(RouteResult::class, false); if ($result instanceof RouteResult) { return $delegate->process($request); } return $this->handleLegacy(); } /* ... */ }
  • 42. Ralf EggertRalf Eggert 4242 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen ZendExpressive Middleware II namespace LegacyMiddleware; use ZendDiactorosResponseHtmlResponse; use Zend_Application; class LegacyApplicationMiddleware implements MiddlewareInterface { public function handleLegacy() { 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); } }
  • 45. Ralf EggertRalf Eggert 4545 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 7: Dependency InjectionTipp 7: Dependency Injection
  • 46. Ralf EggertRalf Eggert 4646 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Dependency Injection Pattern Class PostService instanziiert Class PostItem Class PostService wird injiziert Class PostItem Harte Abhängigkeit Injizierte Abhängigkeit Interface ItemInterfaceimplementiert implementiert
  • 47. Ralf EggertRalf Eggert 4747 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen DI Codebeispiel // harte Abhängigkeit class PostService { public __construct() { $this->item = new PostItem(); } } // Dependency Injection per Setter class PostService { public setItem(PostItem $item) { $this->item = $item; } } // Dependency Injection per Konstruktor class PostService { public __construct( PostItem $item ) { $this->item = $item; } } // Dependency Injection mit Interface class PostService { public __construct( ItemInterface $item ) { $this->item = $item; } }
  • 49. Wann keine Dependency Injection? Methode soll Objekt instanzieren z.B. Entitäten oder Factories
  • 51. Ralf EggertRalf Eggert 5151 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 8: CodestrukturTipp 8: Codestruktur
  • 53. Sonderfall Datenbanken & »Model« Hart kodiertes SQL Models an DB koppeln SQL Injections verhindern Models von DB entkoppeln DB Abstraktion
  • 55. Ralf EggertRalf Eggert 5555 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Tipp 9: Last Boy Scout RegelTipp 9: Last Boy Scout Regel
  • 56. Ralf EggertRalf Eggert 5656 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Nein, nicht Bruce!Nein, nicht Bruce!
  • 57. The Boy Scouts have a rule: »Always leave the campground cleaner than you found it.« What if we followed a similar rule in our code: »Always check a module in cleaner than when you checked it out.« Robert C. Martin (Uncle Bob)
  • 58. Opportunistic Refactoring (last boy-scout rule) »What this means is that at any time someone sees some code that isn't as clear as it should be, they should take the opportunity to fix it right there and then - or at least within a few minutes.« Martin Fowler
  • 59. »Wenn du an einer Methode oder Klasse arbeitest, investiere maximal 15 Minuten, um den Code zu verbessern.« Ralf Eggert Travello GmbH
  • 61. 1. Refactoring1. Refactoring 2. Schritt für Schritt2. Schritt für Schritt 3. End-to-End Tests3. End-to-End Tests 4. Composer4. Composer 5. Tech-Stack Update5. Tech-Stack Update 6. Legacy Weiche6. Legacy Weiche 7. Dependency Injection7. Dependency Injection 8. Codestruktur8. Codestruktur 9 . Last Boy Scout Regel9 . Last Boy Scout Regel
  • 64. Ralf EggertRalf Eggert 6464 vonvon 6464 9 Tipps für die Modernisierung von PHP-Anwendungen9 Tipps für die Modernisierung von PHP-Anwendungen Bildnachweis Ralf Steinberger Abandoned factory building in Northern Italy. (CC BY 2.0) Chris Potter 3D Home Inspection Checklist (CC BY 2.0) Swaroop C H Green fields (CC BY-SA 2.0) Aapo Haapanen Renovation (CC BY 2.0) Sunjo Feuerwerk (CC BY-SA 2.0) Frederik Magle Music Conductor - Frederik Magle conducting a symphony orchestra 9 (CC BY 2.0) Rebecca Siegel Stack (CC BY-SA 2.0) Kecko St. Margrethen - Switzerland (CC BY 2.0) slgckgc September 2012 Court of Honor (CC BY 2.0) Daisuke tashiro Long long stairs (CC BY-SA 2.0) Tomas Sobek Walking down to Rock Burn Valley (CC BY 2.0) Mike Mozart Mess (CC BY 2.0) Adrian Sampson Cable closet (CC BY 2.0) Thomas Claveirole Gears (CC BY-SA 2.0) Eduard Anton Structure (CC BY 2.0) Rohit Chhiber Snotty doubt (CC BY 2.0)