CC BY-SA, James Hammond https://www.flickr.com/photos/jameshammond/8732132809
Bringing TYPO3 Legacy Applications into the Flow
Martin Helmich [email protected] @martin-helmich
Inspiring Conference 2015, Kolbermoor March 28th, 2015
Martin Helmich Software Architect at Mittwald
@martin-helmich @mittwald
CC BY-SA, Wolfgang Wagner https://www.flickr.com/photos/wolfgang-wagner/16958684785
Legacy Applications
CC BY-SA, Photones http://commons.wikimedia.org/wiki/File:Heureka_(Plastik).jpg
CC BY-SA, Gerwin Sturm https://www.flickr.com/photos/scarygami/5518831238
CC BY, Dude of Lego https://www.flickr.com/photos/dudeoflego/5105352800
Option #1
Rewrite From Scratch
CC BY-SA, D464-Darren Hall http://commons.wikimedia.org/wiki/File:Demolition_in_Ballymun_-_Flickr_-_D464-Darren_Hall.jpg
Option #2
Migrate Existing Code
CC BY-SA, Wolfe House & Building Movers http://en.wikipedia.org/wiki/File:Hydrolic_dollies_relocate_house_in_Newark,_Delaware.jpg
TYPO3 FLOW
TYPO3 NEOS
?
TYPO3 CMS
TYPO3 FLOW
TYPO3 NEOS
?
TYPO3 CMS
TYPO3 Extbase
Extbase
pibase
3rd party Frameworks
TYPO3 FLOW
TYPO3 CMS
Extbase
pibase
3rd party Frameworks
TYPO3 FLOW
TYPO3 CMS
Extbase
pibase
3rd party Frameworks
TYPO3 FLOW
TYPO3 CMS
Extbase
pibase
3rd party Frameworks
TYPO3 FLOW
TYPO3 CMS
When
NOT to migrate from CMS
to Flow
Public Domain (both) http://pixabay.com/de/roter-apfel-apple-lecker-di%C3%A4t-83085/ and http://commons.wikimedia.org/wiki/File:Citrus_reticulata.jpg
namespace My\Ext\Domain\Model; use TYPO3\Flow\Annotations as Flow; use Doctrine\ORM\Mapping as ORM;
/** * @Flow\Entity */ class Car {
/** * @var string * @Flow\Validate('NotEmpty') */ protected $licenseNumber;
/** * @var Manufacturer * @ORM\ManyToOne */ protected $manufacturer; }
class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {
/** * @var string * @validate notempty */ protected $licenseNumber;
/** * @var Tx_MyExt_Domain_Model_Manufacturer */ protected $manufacturer; }
TYPO3 CMS (Extbase)
TYPO3 Flow
namespace My\Ext\Domain\Model; use TYPO3\Flow\Annotations as Flow; use Doctrine\ORM\Mapping as ORM;
/** * @Flow\Entity */ class Car {
/** * @var string * @Flow\Validate('NotEmpty') */ protected $licenseNumber;
/** * @var Manufacturer * @ORM\ManyToOne */ protected $manufacturer; }
class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {
/** * @var string * @validate notempty */ protected $licenseNumber;
/** * @var Tx_MyExt_Domain_Model_Manufacturer */ protected $manufacturer; }
TYPO3 CMS (Extbase)
TYPO3 Flow
namespace My\Ext\Domain\Model; use TYPO3\Flow\Annotations as Flow; use Doctrine\ORM\Mapping as ORM;
/** * @Flow\Entity */ class Car {
/** * @var string * @Flow\Validate('NotEmpty') */ protected $licenseNumber;
/** * @var Manufacturer * @ORM\ManyToOne */ protected $manufacturer; }
class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {
/** * @var string * @validate notempty */ protected $licenseNumber;
/** * @var Tx_MyExt_Domain_Model_Manufacturer */ protected $manufacturer; }
TYPO3 CMS (Extbase)
TYPO3 Flow
namespace My\Ext\Domain\Model; use TYPO3\Flow\Annotations as Flow; use Doctrine\ORM\Mapping as ORM;
/** * @Flow\Entity */ class Car {
/** * @var string * @Flow\Validate('NotEmpty') */ protected $licenseNumber;
/** * @var Manufacturer * @ORM\ManyToOne */ protected $manufacturer; }
class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {
/** * @var string * @validate notempty */ protected $licenseNumber;
/** * @var Tx_MyExt_Domain_Model_Manufacturer */ protected $manufacturer; }
TYPO3 CMS (Extbase)
TYPO3 Flow
TYPO3 CMS
Manual Migration
TYPO3 Flow
TYPO3 CMS
Manual Migration
TYPO3 Flow
Largely unusable
TYPO3 CMS TYPO3 Flow
Double maintenance
TYPO3 CMS TYPO3 Flow
TYPO3 CMS TYPO3 Flow
Dependencies between packages
CC BY, Mirko-Tobias Schäfer https://www.flickr.com/photos/gastev/2174504149
Automation
composer require mittwald-typo3/flow-metamorph composer require mittwald-typo3/flow-metamorph-pibase
Installation
<?php
class FooTastic { public function hello($who) { echo "Hello $who!"; } }
hello.php
Input Source
File
<?php
class FooTastic { public function hello($who) { echo "Hello $who!"; } }
hello.php
Input Source
File
Parser
<?php
class FooTastic { public function hello($who) { echo "Hello $who!"; } }
hello.php
Input Source
File
Parser
Abstract Syntax Tree
class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {
/** * @var string * @validate notempty */ protected $licenseNumber;
/** * @var Tx_MyExt_Domain_Model_Manufacturer */ protected $manufacturer; }
Source Code
class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {
/** * @var string * @validate notempty */ protected $licenseNumber;
/** * @var Tx_MyExt_Domain_Model_Manufacturer */ protected $manufacturer; }
class
name=Tx_..._Car abstract=false final=false
extends
name=Tx_..._AbstractEntity
stmts
property
name=licenseNumber docComment="/**\n..."
property
name=manufacturer docComment="/**\n..."
Source Code Syntax Tree
<?php
class FooTastic { public function hello($who) { echo "Hello $who!"; } }
hello.php
Input Source
File
Parser
Abstract Syntax Tree
<?php
class FooTastic { public function hello($who) { echo "Hello $who!"; } }
hello.php
Input Source
File
ParserTransformation
Rules
Trans- former
Abstract Syntax Tree
<?php
class FooTastic { public function hello($who) { echo "Hello $who!"; } }
hello.php
Input Source
File
ParserTransformation
Rules
Trans- former
Printer
<?php namespace Foo; class FooTastic { /** @Flow\Inject */ protected $greeter; public function hello($who) { $this-‐>greeter-‐>greet($who); }
hello_improved.php
output Source File(s)
Abstract Syntax Tree
<?php
class FooTastic { public function hello($who) { echo "Hello $who!"; } }
hello.php
Input Source
File
Parser
class FooTastic: def hello(who): print "Hello %s"\ % who
hello.py
Transformation Rules
Trans- former
Printer
<?php namespace Foo; class FooTastic { /** @Flow\Inject */ protected $greeter; public function hello($who) { $this-‐>greeter-‐>greet($who); }
hello_improved.php
output Source File(s)
Abstract Syntax Tree
namespace My\Ext\Domain\Model; use TYPO3\Flow\Annotations as Flow; use Doctrine\ORM\Mapping as ORM;
/** * @Flow\Entity */ class Car {
/** * @var string * @Flow\Validate('NotEmpty') */ protected $licenseNumber;
/** * @var Manufacturer * @ORM\ManyToOne */ protected $manufacturer; }
class Tx_MyExt_Domain_Model_Car extends Tx_Extbase_DomainObject_AbstractEntity {
/** * @var string * @validate notempty */ protected $licenseNumber;
/** * @var Tx_MyExt_Domain_Model_Manufacturer */ protected $manufacturer; }
TYPO3 CMS (Extbase)
TYPO3 Flow
namespace
name=Mw\MyExt\Domain\Model
uses
use
name=Mw\...\AbstractVehicle alias=AbstractVehicle
stmts
class
name=Car abstract=false final=false
extends
name=AbstractVehicle
stmts
BEFORE
AFTER
„Rename Tx_MyExt_Domain_Model_Car
to Mw\MyExt\Domain\Model\Car“
class
name=Tx_..._Car abstract=false final=false
extends
name=Tx_..._AbstractVehicle
stmts
property name=licenseNumber docComment="/**\n..."
property name=manufacturer docComment="/**\n..."
TYPO3 CMS TYPO3 Flow
Compatibility
Automated Migration
TYPO3 CMS
Old Code, but Feature Complete
TYPO3 Flow
Compatibility
Automated Migration
TYPO3 Flow
Compatibility
TYPO3 CMS
Rewrite iteratively
TYPO3 Flow
Compatibility
TYPO3 CMS
Rewrite iteratively New
features
Compatibility
TYPO3 CMS
Rewrite iteratively
Decomission the old Application
TYPO3 Flow
TYPO3 Flow
Compatibility
TYPO3 CMS
Rewrite iteratively
Migrate continuouslyContinue to maintain
old Application
Automated Code Transformation Merge
Manual correction
Open Problems
Proof of correctness
„How do I know that the auto-generated code is
correct?“
Open Problems
Ease of Extensibility
„I want to migrate from Zend to Flow, but writing new
transformation rules is just too complex!“
Open Problems
Efficiency
„Wouldn’t it be easier to just migrate all my code by hand?“
http://slideshare.net/mhelmich/migrating-from-typo3-cms-to-typo3-flow
https://speakerdeck.com/kdambekalns/migrating-from-typo3-cms-to-typo3-neos
Resources
Thank you
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
[email protected] @martin-helmich https://github.com/martin-helmich https://github.com/mittwald/flow-metamorph