InspiringCon15: Bringing TYPO3 Legacy Applications into the Flow

InspiringCon15: Bringing TYPO3 Legacy Applications into the Flow

License: CC BY-SA

With the release of TYPO3 Flow in 2011 and TYPO3 Neos in 2012, a both flexible and powerful platform was introduced as a possible successor for TYPO3 CMS. However, migration from TYPO3 CMS to TYPO3 Flow and Neos still presents a challenge due to large conceptual differences between the two systems.

This talk will show how the theoretical concepts (which I presented at an earlier talk at T3CONEU14) can be implemented in software to automate a lot of the necessary steps of a TYPO3-to-Flow migration and also present some real-world applications and experiences.

2b68bc93708466a655a4c60458dc7955?s=128

Martin Helmich

March 28, 2015
Tweet

Transcript

  1. CC BY-SA, James Hammond https://www.flickr.com/photos/jameshammond/8732132809 Bringing TYPO3 Legacy Applications into

    the Flow Martin Helmich m.helmich@mittwald.de @martin-helmich Inspiring Conference 2015, Kolbermoor March 28th, 2015
  2. Martin Helmich Software Architect at Mittwald @martin-helmich @mittwald CC BY-SA,

    Wolfgang Wagner https://www.flickr.com/photos/wolfgang-wagner/16958684785
  3. Legacy Applications

  4. CC BY-SA, Photones http://commons.wikimedia.org/wiki/File:Heureka_(Plastik).jpg

  5. CC BY-SA, Gerwin Sturm https://www.flickr.com/photos/scarygami/5518831238

  6. None
  7. CC BY, Dude of Lego https://www.flickr.com/photos/dudeoflego/5105352800

  8. Option #1 Rewrite From Scratch

  9. CC BY-SA, D464-Darren Hall http://commons.wikimedia.org/wiki/File:Demolition_in_Ballymun_-_Flickr_-_D464-Darren_Hall.jpg

  10. Option #2 Migrate Existing Code

  11. CC BY-SA, Wolfe House & Building Movers http://en.wikipedia.org/wiki/File:Hydrolic_dollies_relocate_house_in_Newark,_Delaware.jpg

  12. TYPO3 FLOW TYPO3 NEOS ? TYPO3 CMS

  13. TYPO3 FLOW TYPO3 NEOS ? TYPO3 CMS TYPO3 Extbase

  14. Extbase pibase 3rd party Frameworks TYPO3 FLOW TYPO3 CMS

  15. Extbase pibase 3rd party Frameworks TYPO3 FLOW TYPO3 CMS

  16. Extbase pibase 3rd party Frameworks TYPO3 FLOW TYPO3 CMS

  17. Extbase pibase 3rd party Frameworks TYPO3 FLOW TYPO3 CMS

  18. When NOT to migrate from CMS to Flow

  19. 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

  20. 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
  21. 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
  22. 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
  23. 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
  24. TYPO3 CMS Manual Migration TYPO3 Flow

  25. TYPO3 CMS Manual Migration TYPO3 Flow Largely unusable

  26. TYPO3 CMS TYPO3 Flow Double maintenance

  27. TYPO3 CMS TYPO3 Flow

  28. TYPO3 CMS TYPO3 Flow Dependencies between packages

  29. CC BY, Mirko-Tobias Schäfer https://www.flickr.com/photos/gastev/2174504149 Automation

  30. https://github.com/ mittwald/flow-metamorph

  31. composer require mittwald-typo3/flow-metamorph composer require mittwald-typo3/flow-metamorph-pibase Installation

  32. <?php   class  FooTastic  {      public  function  

    hello($who)  {          echo  "Hello   $who!";      }   }   hello.php Input Source File
  33. <?php   class  FooTastic  {      public  function  

    hello($who)  {          echo  "Hello   $who!";      }   }   hello.php Input Source File Parser
  34. <?php   class  FooTastic  {      public  function  

    hello($who)  {          echo  "Hello   $who!";      }   }   hello.php Input Source File Parser Abstract Syntax Tree
  35. 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
  36. 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
  37. <?php   class  FooTastic  {      public  function  

    hello($who)  {          echo  "Hello   $who!";      }   }   hello.php Input Source File Parser Abstract Syntax Tree
  38. <?php   class  FooTastic  {      public  function  

    hello($who)  {          echo  "Hello   $who!";      }   }   hello.php Input Source File Parser Transformation Rules Trans- former Abstract Syntax Tree
  39. <?php   class  FooTastic  {      public  function  

    hello($who)  {          echo  "Hello   $who!";      }   }   hello.php Input Source File Parser 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
  40. <?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
  41. 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
  42. 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..."
  43. None
  44. None
  45. TYPO3 CMS TYPO3 Flow Compatibility Automated Migration

  46. TYPO3 CMS Old Code, but Feature Complete TYPO3 Flow Compatibility

    Automated Migration
  47. TYPO3 Flow Compatibility TYPO3 CMS Rewrite iteratively

  48. TYPO3 Flow Compatibility TYPO3 CMS Rewrite iteratively New features

  49. Compatibility TYPO3 CMS Rewrite iteratively Decomission the old Application TYPO3

    Flow
  50. TYPO3 Flow Compatibility TYPO3 CMS Rewrite iteratively Migrate continuously Continue

    to maintain old Application
  51. Automated Code Transformation Merge Manual correction

  52. Open Problems Proof of correctness „How do I know that

    the auto-generated code is correct?“
  53. Open Problems Ease of Extensibility „I want to migrate from

    Zend to Flow, but writing new transformation rules is just too complex!“
  54. Open Problems Efficiency „Wouldn’t it be easier to just migrate

    all my code by hand?“
  55. CC BY-SA, Max Mustermann http://mustermann.de

  56. http://slideshare.net/mhelmich/migrating-from-typo3- cms-to-typo3-flow https://speakerdeck.com/kdambekalns/migrating- from-typo3-cms-to-typo3-neos Resources

  57. Thank you This work is licensed under a Creative Commons

    Attribution- ShareAlike 4.0 International License. m.helmich@mittwald.de @martin-helmich https://github.com/martin-helmich https://github.com/mittwald/flow-metamorph