SlideShare a Scribd company logo
1 of 61
It’s all about eXperience
Gaetano Giunta
Daniel Clements
The UK
Symfony
meetup
July 2015
Symfony2 for legacy app
rejuvenation:
the eZPublish case study
1.The Story
2
Do you speak eeazee publish?
3
An Enterprise-grade Web Content management System
Figures
•20K commits, first one in 1999
•3200 php files in default install
•Licensed both under GPL and commercially
•45K community members, 200 partners, 500+ Paying customers!
•Full-time employees!
•Not your average php project
( This is not Product Placement, I swear )
( And it’s not going to last more than 3 slides, I promise )
Do you speak eeazee publish?
4
An Enterprise-grade Web Content management System
Figures
•20K commits, first one in 2002
•3200 php files in default install
•Licensed both under GPL and commercially
•45K community members, 200 partners, 500+ Paying customers!
•Full-time employees!
•Not your average php project
( This is not Product Placement, I swear )
( And it’s not going to last more than 3 slides, I promise )
Do you speak eeazee publish?
5
An Enterprise-grade Web Content management System
Figures
•20K commits, first one in 2002
•3200 php files in default install
•Licensed both under GPL and commercially
•45K community members, 200 partners, 500+ Paying customers!
•Full-time employees!
•Not your average php project
( This is not Product Placement, I swear )
( And it’s not going to last more than 3 slides, I promise )
Do you speak eeazee publish?
6
An Enterprise-grade Web Content management System
Figures
•20K commits, first one in 2002
•3200 php files in default install
•Licensed both under GPL and commercially
•45K commPaying customers!
•Full-time employees!
•Not your average php project
( This is not Product Placement, I swear )
( And it’s not going to last more than 3 slides, I promise )
Do you speak eeazee publish? II
7
Features
•Flexible content model
• Versioning
• Translation
•Separation of content and presentation (templates & themes)
•Wysiwyg editor; in-site editing; import from Office documents
•Advanced search engine (based on SOLR)
•Built-in webshop
•Workflow engine
•Fine grained RBAC
•Cluster-mode for HA
•RSS feeds, SEO, multimedia, geolocation, and much, much more…
Do you speak eeazee publish? II
8
Features
•Flexible content model
• Versioning
• Translation
•Separation of content and presentation (templates & themes)
•Wysiwyg editor; in-site editing; import from Office documents
•Advanced search engine (based on SOLR)
•Built-in webshop
•Workflow engine
•Fine grained RBAC
•Cluster-mode for HA
•RSS feeds, SEO, multimedia, and much, much more…
Do you speak eeazee publish? III
9
Patterns
• Entity-Attribute-Value
•ActiveRecord
•DBAL
• Supports MySQL, PostgreSQL, Oracle
•MVC
• Data can be fetched from templates, making it HMVC in practice
•Templates
• Bespoke language
If it works… Why change?
10
Existing codebase is 10 years old 
High maintenance cost
• Started with no unit tests
• Layers and roles not properly defined / documented
OOP before php had
• Private/protected/static
• Closures
• Namespaces
• Late static binding
• And much more
Not built for an Ajax and REST world
If it works… Why change?
11
Existing codebase is 10 years old 
High maintenance cost
• Started with no unit tests
• Layers and roles not properly defined / documented
OOP before php had
• Private/protected/static
• Closures
• Namespaces
• Late static binding
• And much more
Not built for an Ajax and REST world
If it works… Why change?
12
Existing codebase is 10 years old 
Widely deployed
• Well debugged
• Pitfalls have probably been uncovered by now
Proven to scale
Well known:
• Documentation improved over years
• Tutorials, forums, blogs, aggregators
• Active community of practitioners
• Official training courses and consulting
If it works… Why change?
13
Existing codebase is 10 years old 
Widely deployed
• Well debugged
• Pitfalls have probably been uncovered by now
Proven to scale
Well known:
• Documentation improved over years
• Tutorials, forums, blogs, aggregators
• Active community of practitioners
• Official training courses and consulting
Making (good) decisions
14
The first rewrite phase
• Started beginning of 2011
• Focused on Content Engine
• Using in-house components (Apache Zeta Components)
The second rewrite phase
• Started beginning of 2012
• Base the CMS on an existing framework
Prerequisites - functional
15
• Durable Architecture
• API stability guaranteed
• Battle tested / not (only) the latest trend
• Should still be there in 10 years
• Speed and Scalability
• Lively Community
• Documentation available
• Evolving and getting bugfixes
Prerequisites - technical
16
• Simple Integration with existing API
• HMVC (Hierarchical Model View Controller) stack
• Decoupled Components
• Dependency Injection
• Good Template Engine
• Extensible, Open, Reliable (TM ;-)
Candidates
17
• Java / non-PHP
• Home brew
• Zeta Components
• Zend Framework 2
• Symfony 2 (Full Stack!)
And the winner is…
18
• Java / non-PHP
• Home brew
• Zeta Components
• Zend Framework 2
• Symfony 2 (Full Stack!)
1.The Story
2.The Challenge
19
Backwards compatibility
20
Product Management SCRUM Story:
«As an existing user, I don’t want to be pissed off by a new
#@!$% version!»
Backwards compatibility
21
Product Management SCRUM Story:
«As an existing user, I don’t want to be pissed off by a new
#@!$% version!»
• 100% Data Compatible (same DB scheme)
• Routing fallback to legacy controllers
• Possibility to include legacy templates in the new ones
• Access legacy code from Symfony controllers
• Settings compatibility
• Bonus: access Symfony services from legacy modules
Backwards compatibility
22
Product Management SCRUM Story:
«As an existing user, I don’t want to be pissed off by a new
#@!$% version!»
• 100% Data Compatible (same DB scheme)
• Routing fallback to legacy controllers
• Possibility to include legacy templates in the new ones
• Access legacy code from Symfony controllers
• Settings compatibility
• Bonus: access Symfony services from legacy modules
And while the devs are busy…
23
Things the boss has to account for
• having to maintain 2 codebases for a long time =>
• dev resources split =>
• not a lot of new features for a while
And while the devs are busy…
24
More things the boss has to account for
• Double infrastructure:
• Testing / Support / Packages system / …
• Training your support team / consulting team / sales team /
partners
• Evangelization of the community
• Possibility of a fork of the legacy version ('hostile'
community takeover)
• Customers wanting to pay A LOT to stay on old version and
be supported longer
Making (good) decisions, part II
25
• Coming up with a perfect-out-of-the-box v2 means
dedicating the whole company to the reimplementation
• By the time that version is ready, the market might have
moved on to something else
Solution: take the Minimum Viable Product approach
• Deliver v2 before reaching feature parity
• Iterate quickly
• Downside: keep the v1 around for longer
• But you have to provide the compatibility layer anyway, right?
Making (good) decisions, part II
26
Product Management SCRUM Story:
«As an existing user, I don’t want to be pissed off by a new
#@!$% version!»
• 100% Data Compatible (same DB scheme)
• Routing fallback to legacy controllers
• Possibility to include legacy templates in the new ones
• Access legacy code from Symfony controllers
• Settings compatibility
• Bonus: access Symfony services from legacy modulesChallenge accepted
1.The Story
2.The Challenge
3.A New Architecture
27
Dual-core architecture
28
Icing on the cake
29
The legacy version still works perfectly standalone
1.The Story
2.The Challenge
3.A New Architecture
30
Packing it up
Directory layout
31
New Kernel: a standard Symfony App
Legacy Kernel is isolated in a subdirectory*
* = symlinks still necessary for making assets available
Bundles everywhere!
32
New Kernel: 100% in Sf bundles
Integrated plugin management
33
New “Kernel”: Bundles are installed via composer + config
editing
Legacy Kernel: Extensions are installed via tarball unzip
(manual) + config editing
Solutions:
1. write a custom Composer installer plugin for Legacy
Extensions
2. Allow an eZP Bundle to include a Legacy Extension
Plugin management
34
New “Kernel”: Bundles are installed via composer + config
editing
Legacy Kernel: Extensions are installed via tarball unzip
(manual) + config editing
Solutions:
1. write a custom Composer installer plugin for Legacy
Extensions
2. Allow an eZP Bundle to include a Legacy Extension
1.The Story
2.The Challenge
3.A New Architecture
35
Front Controller
The old Front Controller
36
Not the nicest code ever written
• All logic in the php file – no classes
• 1100 lines of code
• Sets up a huge amount of global variables
• Incorporates tons of logic
• module redirection / re-execution logic
• permission checking
• running the setup wizard if needed
• checking for pending database transactions
• etc…
• Not clearly structured in setup / execute / teardown phases
The new Front Controller
37
use SymfonyComponentHttpFoundationRequest;
require_once __DIR__ . '/../ezpublish/autoload.php'; // set up class autoloading
require_once __DIR__ . '/../ezpublish/EzPublishKernel.php';
$kernel = new EzPublishKernel( 'dev', true ); // extends the Sf Kernel
$kernel->loadClassCache(); // a method from parent
$request = Request::createFromGlobals();
$response = $kernel->handle( $request );
$response->send();
$kernel->terminate( $request, $response );
The Kernel extends the Symfony HTTPKernel
• It adds configuration for the Service Container
• It allows to register bundles via registerBundles()
Refactoring
38
Previous index.php had to be refactored
• All logic moved into a class
• 20 lines of code in index.php!
• Better separation of setup and teardown of the environment
from execution of application logic
=>
• Can now be used as sub-controller
• Or to run any legacy code from any New Kernel context
Bridging legacy code
39
It is sufficient to run it in a closure
• with some performance penalty
1.The Story
2.The Challenge
3.A New Architecture
40
Routing
Legacy Routing
41
eZPublish 4 uses a custom MVC implementation
•Front controller: index.php
•Controllers are “plain php” files, properly declared
•Url syntax: http:// site / module / controller / parameters
•Parameters use a custom format instead of the query string
•Virtual aliases can be added on top
•For all content nodes, a “nice” alias is always generated by the system
• Good for SEO
Technical debt
•No DIC anywhere (registry pattern used)
•No nested controllers
•No provision for REST / AJAX
• Implemented ad-hoc in many plugins (code/functionality duplication)
•Policies are tied to controllers, not to the underlying content model
Seamless integration
43
The ChainRouter from the CMF project is used
Seamless integration
44
The ChainRouter from the CMF project is used
1.The Story
2.The Challenge
3.A New Architecture
45
Caching
Legacy caches
46
eZ Publish 4 has a complicated advanced caching system
For viewing content, cache is generated on access, invalidated on editing
• TTL = infinite
• When editing a content, cache is also invalidated for all related contents
• Extra invalidation rules can be configured
• Can be set up to be pregenerated at editing time (tradeoff: editing speed)
• Cache keys include policies of current user, query string, custom session data
“Cache-blocks” can also be added anywhere in the templates
• Expiry rules can be set on each block, TTL-based or content-editing based
• Breaks mvc principle
Most powerful AND misunderstood feature in the CMS
Legacy caches: up to eleven
47
Historically: built-in “full-page cache” (stores html on disk)
Currently deprecated, in favour of using a caching Reverse Proxy
• Performances same if not better
• Delegate maintenance of part of the stack (Varnish, Squid)
Holy grail of caching: high TTL and support for PURGE command
1. When RP requests page from server, he gets a high TTL => cache page forever
2. When page changes, server tells to RP to purge that url from cache
• Best reduction in number of requests to server while always showing fresh data
• Downside: extremely hard to cache pages for connected users
ESI support as well
• Hard to make efficient, as eZ can not regenerate an ESI block without full page
Legacy caches: up to eleven
48
Historically: built-in “full-page cache” (stores html on disk)
Currently deprecated, in favour of using a caching Reverse Proxy
• Performances same if not better
• Delegate maintenance of part of the stack (Varnish, Squid)
Holy grail of caching: high TTL and support for PURGE command
1. When RP requests page from server, he gets a high TTL => cache page forever
2. When page changes, server tells to RP to purge that url from cache
• Best reduction in number of requests to server while always showing fresh data
• Downside: extremely hard to cache pages for connected users
ESI support as well
• Hard to make efficient, as eZ can not regenerate an ESI block without full page
Integration Wholesale Replacement
49
Symfony has one of the nicest caching systems for web apps
Because it adopts the HTTP model
HTTP Expiration and Validation are used
• By setting caching headers on response object
Integrates with a Gateway Cache (a.k.a. Reverse Proxy)
• Native (built-in, php)
$kernel = new Kernel('prod', false);
$kernel = new HTTPCache($kernel);
• External (Varnish, Squid, ...)
Native support for ESI
• Using {{ render_esi() }} in twig
1.The Story
2.The Challenge
3.A New Architecture
50
Reapingthe
benefits
REST API
51
eZ4 has an incomplete REST API
•Only functionality available: reading content
•Based on Zeta Components MVC component
=>
A new API has been implemented
•Full reading and writing of content is possible
•All “dictionary” data is also available
•Content-type for response can be JSON or XML (with an XSD!)
•Fully restful
• Usage of all HTTP verbs (and then some: PATCH)
• Respect http headers of request (eg: “Accept”)
• HATEOAS: use urls as resource ids
•No separate request handling framework needed: pure Symfony routing
Database Access Layer
52
• eZPublish 4 comes with its own DBAL
• The Content Engine was rewritten on top of Zeta
Components Database (before Symfony adoption)
• Dwindling development
• Shaky support for Oracle, MS SQLServer, etc
• Most Symfony apps use Doctrine
• Fast enough (not the ORM)
• Good support for many databases
=>
• Adopt Doctrine
• Write a stub layer implementing Zeta DB API on top of it
Improving performances
53
• The queries generated by eZPublish 4 have been hand
tweaked for years
• The new Content Engine not so much
• Designed to run on non-sql storage
• Many more layers of separation
• Generated queries are suboptimal
=>
• Introduce a Content Cache
• Built using Stash (www.stashphp.com)
• Multiple storage backends
• Fully tested
Improving performances
54
• The queries generated by eZPublish 4 have been hand
tweaked for years
• The new Content Engine not so much
• Designed to run on non-sql storage
• Many more layers of separation
• Generated queries are suboptimal
=>
• Introduce a Content Cache
• Built using Stash (www.stashphp.com)
• Multiple storage backends
• Fully tested
Templating
55
• eZPublish 4 comes with its own template language
• Syntax similar to Smarty
• Compiler has very limited capabilities
• Support in IDEs is spotty
• Symfony comes with TWIG template engine
• Fast enough
• Good way to support inheritance
• Extensible
=>
• Adopt TWIG
• Implement custom helpers (filters / tag / functions)
Managing Assets
56
• eZPublish 4 comes with its own assets plugin
• Minifies and compresses CSS, JS
• Doubles as core plugin for all things AJAX
• Hard dependency on JQuery and YUI versions
• No support for LESS,SASS, etc…
=>
• Adopt Assetic
• Currently working on: support for multiple site themes
Community Bundles
57
Replacing - and improving - existing functionality
• csrf token Symfony
• Reverse Proxy integration FosHttpCacheBundle
• Image manipulation LiipImagineBundle
• Pagination WhiteOctoberPagerFanta
• Menu building KnpMenuBundle
• Breadcrumbs BreadcrumbsBundle
• IO/storage LeagueFlysystem
Testing
58
eZ4 has an incomplete test suite
• No unit testing
• Selenium for functional testing
• Jenkins as CI server
• Manual labour still involved
• High maintenance cost
=>
• Phpunit for unit testing
• 100% API Coverage is the goal
• Behat for all the rest
• Travis for good platform coverage
Testing
59
eZ4 has an incomplete test suite
• No unit testing
• Selenium for functional testing
• Jenkins as CI server
• Manual labour still involved
• High maintenance cost
=>
• Phpunit for unit testing
• 100% API Coverage is the goal
• Behat for all the rest
• Travis for good platform coverage
The story so far
60
• First release: November 2012
• 8 major releases
• Legacy Kernel not included anymore since 2015
• New modern Administration UI in beta
• Will be launched as eZ Platform this fall
• Good collaboration with the Symfony ecosystem
We’ll be here all night
61
THANK YOU
<link to slideshare>
• @gggeek
• @declemo
• www.kaliop.co.uk
• www.ez.no
• share.ez.no
• doc.ez.no
• github.com/ezsystems
And Now For Something Completely Different
62

More Related Content

What's hot

Strategic Modernization with PHP on IBM i
Strategic Modernization with PHP on IBM iStrategic Modernization with PHP on IBM i
Strategic Modernization with PHP on IBM iAlan Seiden
 
BP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoBP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoSerdar Basegmez
 
CLA Summit 2013: Connecting LabVIEW to Everything Else
CLA Summit 2013: Connecting LabVIEW to Everything ElseCLA Summit 2013: Connecting LabVIEW to Everything Else
CLA Summit 2013: Connecting LabVIEW to Everything ElseJKI
 
PHP, Cloud And Microsoft Symfony Live 2010
PHP,  Cloud And  Microsoft    Symfony  Live 2010PHP,  Cloud And  Microsoft    Symfony  Live 2010
PHP, Cloud And Microsoft Symfony Live 2010guest5a7126
 
NCDevCon 2017 - Cross Platform Mobile Apps
NCDevCon 2017 - Cross Platform Mobile AppsNCDevCon 2017 - Cross Platform Mobile Apps
NCDevCon 2017 - Cross Platform Mobile AppsJohn M. Wargo
 
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...Daniel Oh
 
Dr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin developmentDr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin developmentUlrich Krause
 
Continuous delivery applied (DC CI User Group)
Continuous delivery applied (DC CI User Group)Continuous delivery applied (DC CI User Group)
Continuous delivery applied (DC CI User Group)Mike McGarr
 
(Re)-Introduction to Maven
(Re)-Introduction to Maven(Re)-Introduction to Maven
(Re)-Introduction to MavenEric Wyles
 
Enterprise OSGi at eBay
Enterprise OSGi at eBayEnterprise OSGi at eBay
Enterprise OSGi at eBayTony Ng
 
Domino OSGi Development
Domino OSGi DevelopmentDomino OSGi Development
Domino OSGi DevelopmentPaul Fiore
 
ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...
ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...
ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...Symphony Software Foundation
 
DB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM iDB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM iAlan Seiden
 
OpenNTF Webinar, March, 2021
OpenNTF Webinar, March, 2021OpenNTF Webinar, March, 2021
OpenNTF Webinar, March, 2021Howard Greenberg
 
10 things you need to know to deliver a successful Alfresco project
10 things you need to know to deliver a successful Alfresco project10 things you need to know to deliver a successful Alfresco project
10 things you need to know to deliver a successful Alfresco projectSymphony Software Foundation
 
PHP Batch Jobs on IBM i
PHP Batch Jobs on IBM iPHP Batch Jobs on IBM i
PHP Batch Jobs on IBM iAlan Seiden
 
Migration tales from java ee 5 to 7
Migration tales from java ee 5 to 7Migration tales from java ee 5 to 7
Migration tales from java ee 5 to 7Roberto Cortez
 
Microservices with Kubernetes, Docker, and Jenkins
Microservices with Kubernetes, Docker, and JenkinsMicroservices with Kubernetes, Docker, and Jenkins
Microservices with Kubernetes, Docker, and JenkinsRafael Benevides
 
Dd13.2013.milano.open ntf
Dd13.2013.milano.open ntfDd13.2013.milano.open ntf
Dd13.2013.milano.open ntfUlrich Krause
 

What's hot (20)

Strategic Modernization with PHP on IBM i
Strategic Modernization with PHP on IBM iStrategic Modernization with PHP on IBM i
Strategic Modernization with PHP on IBM i
 
BP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoBP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM Domino
 
CLA Summit 2013: Connecting LabVIEW to Everything Else
CLA Summit 2013: Connecting LabVIEW to Everything ElseCLA Summit 2013: Connecting LabVIEW to Everything Else
CLA Summit 2013: Connecting LabVIEW to Everything Else
 
PHP, Cloud And Microsoft Symfony Live 2010
PHP,  Cloud And  Microsoft    Symfony  Live 2010PHP,  Cloud And  Microsoft    Symfony  Live 2010
PHP, Cloud And Microsoft Symfony Live 2010
 
NCDevCon 2017 - Cross Platform Mobile Apps
NCDevCon 2017 - Cross Platform Mobile AppsNCDevCon 2017 - Cross Platform Mobile Apps
NCDevCon 2017 - Cross Platform Mobile Apps
 
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
ApacheCon Europe 2016 : CONTAINERS IN ACTION - Transform Application Delivery...
 
Dr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin developmentDr. Strangelove, or how I learned to love plugin development
Dr. Strangelove, or how I learned to love plugin development
 
Continuous delivery applied (DC CI User Group)
Continuous delivery applied (DC CI User Group)Continuous delivery applied (DC CI User Group)
Continuous delivery applied (DC CI User Group)
 
(Re)-Introduction to Maven
(Re)-Introduction to Maven(Re)-Introduction to Maven
(Re)-Introduction to Maven
 
Enterprise OSGi at eBay
Enterprise OSGi at eBayEnterprise OSGi at eBay
Enterprise OSGi at eBay
 
Domino OSGi Development
Domino OSGi DevelopmentDomino OSGi Development
Domino OSGi Development
 
ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...
ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...
ApacheCon NA 2015 - Gabriele Columbro - Is Open Source the right model in the...
 
DB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM iDB2 and PHP in Depth on IBM i
DB2 and PHP in Depth on IBM i
 
OpenNTF Webinar, March, 2021
OpenNTF Webinar, March, 2021OpenNTF Webinar, March, 2021
OpenNTF Webinar, March, 2021
 
10 things you need to know to deliver a successful Alfresco project
10 things you need to know to deliver a successful Alfresco project10 things you need to know to deliver a successful Alfresco project
10 things you need to know to deliver a successful Alfresco project
 
PHP Batch Jobs on IBM i
PHP Batch Jobs on IBM iPHP Batch Jobs on IBM i
PHP Batch Jobs on IBM i
 
Migration tales from java ee 5 to 7
Migration tales from java ee 5 to 7Migration tales from java ee 5 to 7
Migration tales from java ee 5 to 7
 
Microservices with Kubernetes, Docker, and Jenkins
Microservices with Kubernetes, Docker, and JenkinsMicroservices with Kubernetes, Docker, and Jenkins
Microservices with Kubernetes, Docker, and Jenkins
 
Dd13.2013.milano.open ntf
Dd13.2013.milano.open ntfDd13.2013.milano.open ntf
Dd13.2013.milano.open ntf
 
Let me introduce you: DOTS
Let me introduce you: DOTSLet me introduce you: DOTS
Let me introduce you: DOTS
 

Viewers also liked

Modernisation of legacy php to Symfony 2
Modernisation of legacy php to Symfony 2Modernisation of legacy php to Symfony 2
Modernisation of legacy php to Symfony 2Fabrice Bernhard
 
Marry me...? Legacy Code und Symfony2 verkuppeln
Marry me...? Legacy Code und Symfony2 verkuppelnMarry me...? Legacy Code und Symfony2 verkuppeln
Marry me...? Legacy Code und Symfony2 verkuppelnwebfactory GmbH
 
eZ Publish 5, Re architecture, pitfalls and opportunities
eZ Publish 5, Re architecture, pitfalls and opportunitieseZ Publish 5, Re architecture, pitfalls and opportunities
eZ Publish 5, Re architecture, pitfalls and opportunitiesAndré Rømcke
 
eZ Publish Platform 5.4 public webinar
eZ Publish Platform 5.4 public webinareZ Publish Platform 5.4 public webinar
eZ Publish Platform 5.4 public webinarRoland Benedetti
 
Introducing eZ Publish Platform 5.1 - webinar
Introducing eZ Publish Platform 5.1 - webinarIntroducing eZ Publish Platform 5.1 - webinar
Introducing eZ Publish Platform 5.1 - webinarRoland Benedetti
 
BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2Mohammed Rhamnia
 
With Great Power comes Great Responsibilities
With Great Power comes Great ResponsibilitiesWith Great Power comes Great Responsibilities
With Great Power comes Great ResponsibilitiesFabrice Bernhard
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackIgnacio Martín
 

Viewers also liked (8)

Modernisation of legacy php to Symfony 2
Modernisation of legacy php to Symfony 2Modernisation of legacy php to Symfony 2
Modernisation of legacy php to Symfony 2
 
Marry me...? Legacy Code und Symfony2 verkuppeln
Marry me...? Legacy Code und Symfony2 verkuppelnMarry me...? Legacy Code und Symfony2 verkuppeln
Marry me...? Legacy Code und Symfony2 verkuppeln
 
eZ Publish 5, Re architecture, pitfalls and opportunities
eZ Publish 5, Re architecture, pitfalls and opportunitieseZ Publish 5, Re architecture, pitfalls and opportunities
eZ Publish 5, Re architecture, pitfalls and opportunities
 
eZ Publish Platform 5.4 public webinar
eZ Publish Platform 5.4 public webinareZ Publish Platform 5.4 public webinar
eZ Publish Platform 5.4 public webinar
 
Introducing eZ Publish Platform 5.1 - webinar
Introducing eZ Publish Platform 5.1 - webinarIntroducing eZ Publish Platform 5.1 - webinar
Introducing eZ Publish Platform 5.1 - webinar
 
BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2BDD avec Behat, PhpSpec et Symfony2
BDD avec Behat, PhpSpec et Symfony2
 
With Great Power comes Great Responsibilities
With Great Power comes Great ResponsibilitiesWith Great Power comes Great Responsibilities
With Great Power comes Great Responsibilities
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and Webpack
 

Similar to Symfony2 for legacy app rejuvenation: the eZ Publish case study

Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...Max Romanovsky
 
Symfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim RomanovskySymfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim Romanovskyphp-user-group-minsk
 
Continuous Integration at Mollie
Continuous Integration at MollieContinuous Integration at Mollie
Continuous Integration at Molliewillemstuursma
 
They why behind php frameworks
They why behind php frameworksThey why behind php frameworks
They why behind php frameworksKirk Madera
 
Sitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helixSitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helixPeter Nazarov
 
Architectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and ConsistentlyArchitectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and ConsistentlyComsysto Reply GmbH
 
Architectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and ConsistentlyArchitectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and ConsistentlyComsysto Reply GmbH
 
Drupal 8 deeper dive
Drupal 8 deeper diveDrupal 8 deeper dive
Drupal 8 deeper diveAmazee Labs
 
Continuous Integration
Continuous IntegrationContinuous Integration
Continuous IntegrationXPDays
 
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...Chocolatey Software
 
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...Michel Buczynski
 
Staging and Deployment
Staging and DeploymentStaging and Deployment
Staging and Deploymentheyrocker
 
Headless cms architecture
Headless cms architectureHeadless cms architecture
Headless cms architectureKevin Wenger
 
PHP Unconference Continuous Integration
PHP Unconference Continuous IntegrationPHP Unconference Continuous Integration
PHP Unconference Continuous IntegrationNils Hofmeister
 
SQL Server DevOps Jumpstart
SQL Server DevOps JumpstartSQL Server DevOps Jumpstart
SQL Server DevOps JumpstartOri Donner
 
Portable infrastructure with puppet
Portable infrastructure with puppetPortable infrastructure with puppet
Portable infrastructure with puppetlkanies
 
Docking, loading, running domino on docker v12
Docking, loading, running domino on docker v12Docking, loading, running domino on docker v12
Docking, loading, running domino on docker v12Daniele Vistalli
 
DockerCon 15 Keynote - Day 2
DockerCon 15 Keynote - Day 2DockerCon 15 Keynote - Day 2
DockerCon 15 Keynote - Day 2Docker, Inc.
 
New life inside monolithic application
New life inside monolithic applicationNew life inside monolithic application
New life inside monolithic applicationTaras Matyashovsky
 

Similar to Symfony2 for legacy app rejuvenation: the eZ Publish case study (20)

Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...
 
Symfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim RomanovskySymfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim Romanovsky
 
Continuous Integration at Mollie
Continuous Integration at MollieContinuous Integration at Mollie
Continuous Integration at Mollie
 
They why behind php frameworks
They why behind php frameworksThey why behind php frameworks
They why behind php frameworks
 
Sitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helixSitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helix
 
Architectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and ConsistentlyArchitectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and Consistently
 
Architectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and ConsistentlyArchitectural Decisions: Smoothly and Consistently
Architectural Decisions: Smoothly and Consistently
 
Drupal 8 deeper dive
Drupal 8 deeper diveDrupal 8 deeper dive
Drupal 8 deeper dive
 
Continuous Integration
Continuous IntegrationContinuous Integration
Continuous Integration
 
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
 
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
Facilitating continuous delivery in a FinTech world with Salt, Jenkins, Nexus...
 
Staging and Deployment
Staging and DeploymentStaging and Deployment
Staging and Deployment
 
Headless cms architecture
Headless cms architectureHeadless cms architecture
Headless cms architecture
 
PHP Unconference Continuous Integration
PHP Unconference Continuous IntegrationPHP Unconference Continuous Integration
PHP Unconference Continuous Integration
 
SQL Server DevOps Jumpstart
SQL Server DevOps JumpstartSQL Server DevOps Jumpstart
SQL Server DevOps Jumpstart
 
Portable infrastructure with puppet
Portable infrastructure with puppetPortable infrastructure with puppet
Portable infrastructure with puppet
 
Docking, loading, running domino on docker v12
Docking, loading, running domino on docker v12Docking, loading, running domino on docker v12
Docking, loading, running domino on docker v12
 
DockerCon 15 Keynote - Day 2
DockerCon 15 Keynote - Day 2DockerCon 15 Keynote - Day 2
DockerCon 15 Keynote - Day 2
 
New life inside monolithic application
New life inside monolithic applicationNew life inside monolithic application
New life inside monolithic application
 
Versioning for Developers
Versioning for DevelopersVersioning for Developers
Versioning for Developers
 

More from Gaetano Giunta

php day 2008 - Introduzione agli ez components
php day 2008 - Introduzione agli ez componentsphp day 2008 - Introduzione agli ez components
php day 2008 - Introduzione agli ez componentsGaetano Giunta
 
phpday 2006 - SEA case study
phpday 2006 - SEA case studyphpday 2006 - SEA case study
phpday 2006 - SEA case studyGaetano Giunta
 
phpday 2006 - WS in PHP
phpday 2006 - WS in PHPphpday 2006 - WS in PHP
phpday 2006 - WS in PHPGaetano Giunta
 
Powerful Automation Made Simple
Powerful Automation Made SimplePowerful Automation Made Simple
Powerful Automation Made SimpleGaetano Giunta
 
Managing changes to eZPublish Database
Managing changes to eZPublish DatabaseManaging changes to eZPublish Database
Managing changes to eZPublish DatabaseGaetano Giunta
 
Symfony vs. Message Brokers
Symfony  vs.  Message BrokersSymfony  vs.  Message Brokers
Symfony vs. Message BrokersGaetano Giunta
 
Designing a Docker Stack for Symfony apps: lessons learned
Designing a Docker Stack  for Symfony apps: lessons learnedDesigning a Docker Stack  for Symfony apps: lessons learned
Designing a Docker Stack for Symfony apps: lessons learnedGaetano Giunta
 
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...Gaetano Giunta
 
Rabbits, indians and... Symfony meets queueing brokers
Rabbits, indians and...  Symfony meets queueing brokersRabbits, indians and...  Symfony meets queueing brokers
Rabbits, indians and... Symfony meets queueing brokersGaetano Giunta
 
Making Symfony Services async with RabbitMq (and more Symfony)
Making Symfony Services async with RabbitMq (and more Symfony)Making Symfony Services async with RabbitMq (and more Symfony)
Making Symfony Services async with RabbitMq (and more Symfony)Gaetano Giunta
 
EzPerformancelogger & Graphite
EzPerformancelogger & GraphiteEzPerformancelogger & Graphite
EzPerformancelogger & GraphiteGaetano Giunta
 
Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...
Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...
Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...Gaetano Giunta
 
eZPublish meets Simfony2 - phpDay2013
eZPublish meets Simfony2  - phpDay2013eZPublish meets Simfony2  - phpDay2013
eZPublish meets Simfony2 - phpDay2013Gaetano Giunta
 
Ez performance measurement
Ez performance measurementEz performance measurement
Ez performance measurementGaetano Giunta
 
Ez Content Staging for the rest of us
Ez Content Staging for the rest of usEz Content Staging for the rest of us
Ez Content Staging for the rest of usGaetano Giunta
 
An eZ Publish Craftsman's toolchest
An eZ Publish Craftsman's toolchestAn eZ Publish Craftsman's toolchest
An eZ Publish Craftsman's toolchestGaetano Giunta
 

More from Gaetano Giunta (16)

php day 2008 - Introduzione agli ez components
php day 2008 - Introduzione agli ez componentsphp day 2008 - Introduzione agli ez components
php day 2008 - Introduzione agli ez components
 
phpday 2006 - SEA case study
phpday 2006 - SEA case studyphpday 2006 - SEA case study
phpday 2006 - SEA case study
 
phpday 2006 - WS in PHP
phpday 2006 - WS in PHPphpday 2006 - WS in PHP
phpday 2006 - WS in PHP
 
Powerful Automation Made Simple
Powerful Automation Made SimplePowerful Automation Made Simple
Powerful Automation Made Simple
 
Managing changes to eZPublish Database
Managing changes to eZPublish DatabaseManaging changes to eZPublish Database
Managing changes to eZPublish Database
 
Symfony vs. Message Brokers
Symfony  vs.  Message BrokersSymfony  vs.  Message Brokers
Symfony vs. Message Brokers
 
Designing a Docker Stack for Symfony apps: lessons learned
Designing a Docker Stack  for Symfony apps: lessons learnedDesigning a Docker Stack  for Symfony apps: lessons learned
Designing a Docker Stack for Symfony apps: lessons learned
 
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
eZ Publish 5: from zero to automated deployment (and no regressions!) in one ...
 
Rabbits, indians and... Symfony meets queueing brokers
Rabbits, indians and...  Symfony meets queueing brokersRabbits, indians and...  Symfony meets queueing brokers
Rabbits, indians and... Symfony meets queueing brokers
 
Making Symfony Services async with RabbitMq (and more Symfony)
Making Symfony Services async with RabbitMq (and more Symfony)Making Symfony Services async with RabbitMq (and more Symfony)
Making Symfony Services async with RabbitMq (and more Symfony)
 
EzPerformancelogger & Graphite
EzPerformancelogger & GraphiteEzPerformancelogger & Graphite
EzPerformancelogger & Graphite
 
Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...
Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...
Symfony HTTP Kernel for refactoring legacy apps: the eZ Publish case study - ...
 
eZPublish meets Simfony2 - phpDay2013
eZPublish meets Simfony2  - phpDay2013eZPublish meets Simfony2  - phpDay2013
eZPublish meets Simfony2 - phpDay2013
 
Ez performance measurement
Ez performance measurementEz performance measurement
Ez performance measurement
 
Ez Content Staging for the rest of us
Ez Content Staging for the rest of usEz Content Staging for the rest of us
Ez Content Staging for the rest of us
 
An eZ Publish Craftsman's toolchest
An eZ Publish Craftsman's toolchestAn eZ Publish Craftsman's toolchest
An eZ Publish Craftsman's toolchest
 

Recently uploaded

Top 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptxTop 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptxDyna Gilbert
 
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一Fs
 
NSX-T and Service Interfaces presentation
NSX-T and Service Interfaces presentationNSX-T and Service Interfaces presentation
NSX-T and Service Interfaces presentationMarko4394
 
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作ys8omjxb
 
Q4-1-Illustrating-Hypothesis-Testing.pptx
Q4-1-Illustrating-Hypothesis-Testing.pptxQ4-1-Illustrating-Hypothesis-Testing.pptx
Q4-1-Illustrating-Hypothesis-Testing.pptxeditsforyah
 
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一Fs
 
『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书
『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书
『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书rnrncn29
 
Film cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasaFilm cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasa494f574xmv
 
Font Performance - NYC WebPerf Meetup April '24
Font Performance - NYC WebPerf Meetup April '24Font Performance - NYC WebPerf Meetup April '24
Font Performance - NYC WebPerf Meetup April '24Paul Calvano
 
Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Excelmac1
 
Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Sonam Pathan
 
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一z xss
 
Contact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New DelhiContact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New Delhimiss dipika
 
Git and Github workshop GDSC MLRITM
Git and Github  workshop GDSC MLRITMGit and Github  workshop GDSC MLRITM
Git and Github workshop GDSC MLRITMgdsc13
 
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Sonam Pathan
 
PHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 DocumentationPHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 DocumentationLinaWolf1
 
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一Fs
 
SCM Symposium PPT Format Customer loyalty is predi
SCM Symposium PPT Format Customer loyalty is prediSCM Symposium PPT Format Customer loyalty is predi
SCM Symposium PPT Format Customer loyalty is predieusebiomeyer
 
Elevate Your Business with Our IT Expertise in New Orleans
Elevate Your Business with Our IT Expertise in New OrleansElevate Your Business with Our IT Expertise in New Orleans
Elevate Your Business with Our IT Expertise in New Orleanscorenetworkseo
 

Recently uploaded (20)

Top 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptxTop 10 Interactive Website Design Trends in 2024.pptx
Top 10 Interactive Website Design Trends in 2024.pptx
 
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
 
NSX-T and Service Interfaces presentation
NSX-T and Service Interfaces presentationNSX-T and Service Interfaces presentation
NSX-T and Service Interfaces presentation
 
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
 
young call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Service
young call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Serviceyoung call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Service
young call girls in Uttam Nagar🔝 9953056974 🔝 Delhi escort Service
 
Q4-1-Illustrating-Hypothesis-Testing.pptx
Q4-1-Illustrating-Hypothesis-Testing.pptxQ4-1-Illustrating-Hypothesis-Testing.pptx
Q4-1-Illustrating-Hypothesis-Testing.pptx
 
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
 
『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书
『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书
『澳洲文凭』买詹姆士库克大学毕业证书成绩单办理澳洲JCU文凭学位证书
 
Film cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasaFilm cover research (1).pptxsdasdasdasdasdasa
Film cover research (1).pptxsdasdasdasdasdasa
 
Font Performance - NYC WebPerf Meetup April '24
Font Performance - NYC WebPerf Meetup April '24Font Performance - NYC WebPerf Meetup April '24
Font Performance - NYC WebPerf Meetup April '24
 
Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...
 
Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170
 
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
办理(UofR毕业证书)罗切斯特大学毕业证成绩单原版一比一
 
Contact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New DelhiContact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New Delhi
 
Git and Github workshop GDSC MLRITM
Git and Github  workshop GDSC MLRITMGit and Github  workshop GDSC MLRITM
Git and Github workshop GDSC MLRITM
 
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
 
PHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 DocumentationPHP-based rendering of TYPO3 Documentation
PHP-based rendering of TYPO3 Documentation
 
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
 
SCM Symposium PPT Format Customer loyalty is predi
SCM Symposium PPT Format Customer loyalty is prediSCM Symposium PPT Format Customer loyalty is predi
SCM Symposium PPT Format Customer loyalty is predi
 
Elevate Your Business with Our IT Expertise in New Orleans
Elevate Your Business with Our IT Expertise in New OrleansElevate Your Business with Our IT Expertise in New Orleans
Elevate Your Business with Our IT Expertise in New Orleans
 

Symfony2 for legacy app rejuvenation: the eZ Publish case study

  • 1. It’s all about eXperience Gaetano Giunta Daniel Clements The UK Symfony meetup July 2015 Symfony2 for legacy app rejuvenation: the eZPublish case study
  • 3. Do you speak eeazee publish? 3 An Enterprise-grade Web Content management System Figures •20K commits, first one in 1999 •3200 php files in default install •Licensed both under GPL and commercially •45K community members, 200 partners, 500+ Paying customers! •Full-time employees! •Not your average php project ( This is not Product Placement, I swear ) ( And it’s not going to last more than 3 slides, I promise )
  • 4. Do you speak eeazee publish? 4 An Enterprise-grade Web Content management System Figures •20K commits, first one in 2002 •3200 php files in default install •Licensed both under GPL and commercially •45K community members, 200 partners, 500+ Paying customers! •Full-time employees! •Not your average php project ( This is not Product Placement, I swear ) ( And it’s not going to last more than 3 slides, I promise )
  • 5. Do you speak eeazee publish? 5 An Enterprise-grade Web Content management System Figures •20K commits, first one in 2002 •3200 php files in default install •Licensed both under GPL and commercially •45K community members, 200 partners, 500+ Paying customers! •Full-time employees! •Not your average php project ( This is not Product Placement, I swear ) ( And it’s not going to last more than 3 slides, I promise )
  • 6. Do you speak eeazee publish? 6 An Enterprise-grade Web Content management System Figures •20K commits, first one in 2002 •3200 php files in default install •Licensed both under GPL and commercially •45K commPaying customers! •Full-time employees! •Not your average php project ( This is not Product Placement, I swear ) ( And it’s not going to last more than 3 slides, I promise )
  • 7. Do you speak eeazee publish? II 7 Features •Flexible content model • Versioning • Translation •Separation of content and presentation (templates & themes) •Wysiwyg editor; in-site editing; import from Office documents •Advanced search engine (based on SOLR) •Built-in webshop •Workflow engine •Fine grained RBAC •Cluster-mode for HA •RSS feeds, SEO, multimedia, geolocation, and much, much more…
  • 8. Do you speak eeazee publish? II 8 Features •Flexible content model • Versioning • Translation •Separation of content and presentation (templates & themes) •Wysiwyg editor; in-site editing; import from Office documents •Advanced search engine (based on SOLR) •Built-in webshop •Workflow engine •Fine grained RBAC •Cluster-mode for HA •RSS feeds, SEO, multimedia, and much, much more…
  • 9. Do you speak eeazee publish? III 9 Patterns • Entity-Attribute-Value •ActiveRecord •DBAL • Supports MySQL, PostgreSQL, Oracle •MVC • Data can be fetched from templates, making it HMVC in practice •Templates • Bespoke language
  • 10. If it works… Why change? 10 Existing codebase is 10 years old  High maintenance cost • Started with no unit tests • Layers and roles not properly defined / documented OOP before php had • Private/protected/static • Closures • Namespaces • Late static binding • And much more Not built for an Ajax and REST world
  • 11. If it works… Why change? 11 Existing codebase is 10 years old  High maintenance cost • Started with no unit tests • Layers and roles not properly defined / documented OOP before php had • Private/protected/static • Closures • Namespaces • Late static binding • And much more Not built for an Ajax and REST world
  • 12. If it works… Why change? 12 Existing codebase is 10 years old  Widely deployed • Well debugged • Pitfalls have probably been uncovered by now Proven to scale Well known: • Documentation improved over years • Tutorials, forums, blogs, aggregators • Active community of practitioners • Official training courses and consulting
  • 13. If it works… Why change? 13 Existing codebase is 10 years old  Widely deployed • Well debugged • Pitfalls have probably been uncovered by now Proven to scale Well known: • Documentation improved over years • Tutorials, forums, blogs, aggregators • Active community of practitioners • Official training courses and consulting
  • 14. Making (good) decisions 14 The first rewrite phase • Started beginning of 2011 • Focused on Content Engine • Using in-house components (Apache Zeta Components) The second rewrite phase • Started beginning of 2012 • Base the CMS on an existing framework
  • 15. Prerequisites - functional 15 • Durable Architecture • API stability guaranteed • Battle tested / not (only) the latest trend • Should still be there in 10 years • Speed and Scalability • Lively Community • Documentation available • Evolving and getting bugfixes
  • 16. Prerequisites - technical 16 • Simple Integration with existing API • HMVC (Hierarchical Model View Controller) stack • Decoupled Components • Dependency Injection • Good Template Engine • Extensible, Open, Reliable (TM ;-)
  • 17. Candidates 17 • Java / non-PHP • Home brew • Zeta Components • Zend Framework 2 • Symfony 2 (Full Stack!)
  • 18. And the winner is… 18 • Java / non-PHP • Home brew • Zeta Components • Zend Framework 2 • Symfony 2 (Full Stack!)
  • 20. Backwards compatibility 20 Product Management SCRUM Story: «As an existing user, I don’t want to be pissed off by a new #@!$% version!»
  • 21. Backwards compatibility 21 Product Management SCRUM Story: «As an existing user, I don’t want to be pissed off by a new #@!$% version!» • 100% Data Compatible (same DB scheme) • Routing fallback to legacy controllers • Possibility to include legacy templates in the new ones • Access legacy code from Symfony controllers • Settings compatibility • Bonus: access Symfony services from legacy modules
  • 22. Backwards compatibility 22 Product Management SCRUM Story: «As an existing user, I don’t want to be pissed off by a new #@!$% version!» • 100% Data Compatible (same DB scheme) • Routing fallback to legacy controllers • Possibility to include legacy templates in the new ones • Access legacy code from Symfony controllers • Settings compatibility • Bonus: access Symfony services from legacy modules
  • 23. And while the devs are busy… 23 Things the boss has to account for • having to maintain 2 codebases for a long time => • dev resources split => • not a lot of new features for a while
  • 24. And while the devs are busy… 24 More things the boss has to account for • Double infrastructure: • Testing / Support / Packages system / … • Training your support team / consulting team / sales team / partners • Evangelization of the community • Possibility of a fork of the legacy version ('hostile' community takeover) • Customers wanting to pay A LOT to stay on old version and be supported longer
  • 25. Making (good) decisions, part II 25 • Coming up with a perfect-out-of-the-box v2 means dedicating the whole company to the reimplementation • By the time that version is ready, the market might have moved on to something else Solution: take the Minimum Viable Product approach • Deliver v2 before reaching feature parity • Iterate quickly • Downside: keep the v1 around for longer • But you have to provide the compatibility layer anyway, right?
  • 26. Making (good) decisions, part II 26 Product Management SCRUM Story: «As an existing user, I don’t want to be pissed off by a new #@!$% version!» • 100% Data Compatible (same DB scheme) • Routing fallback to legacy controllers • Possibility to include legacy templates in the new ones • Access legacy code from Symfony controllers • Settings compatibility • Bonus: access Symfony services from legacy modulesChallenge accepted
  • 27. 1.The Story 2.The Challenge 3.A New Architecture 27
  • 29. Icing on the cake 29 The legacy version still works perfectly standalone
  • 30. 1.The Story 2.The Challenge 3.A New Architecture 30 Packing it up
  • 31. Directory layout 31 New Kernel: a standard Symfony App Legacy Kernel is isolated in a subdirectory* * = symlinks still necessary for making assets available
  • 33. Integrated plugin management 33 New “Kernel”: Bundles are installed via composer + config editing Legacy Kernel: Extensions are installed via tarball unzip (manual) + config editing Solutions: 1. write a custom Composer installer plugin for Legacy Extensions 2. Allow an eZP Bundle to include a Legacy Extension
  • 34. Plugin management 34 New “Kernel”: Bundles are installed via composer + config editing Legacy Kernel: Extensions are installed via tarball unzip (manual) + config editing Solutions: 1. write a custom Composer installer plugin for Legacy Extensions 2. Allow an eZP Bundle to include a Legacy Extension
  • 35. 1.The Story 2.The Challenge 3.A New Architecture 35 Front Controller
  • 36. The old Front Controller 36 Not the nicest code ever written • All logic in the php file – no classes • 1100 lines of code • Sets up a huge amount of global variables • Incorporates tons of logic • module redirection / re-execution logic • permission checking • running the setup wizard if needed • checking for pending database transactions • etc… • Not clearly structured in setup / execute / teardown phases
  • 37. The new Front Controller 37 use SymfonyComponentHttpFoundationRequest; require_once __DIR__ . '/../ezpublish/autoload.php'; // set up class autoloading require_once __DIR__ . '/../ezpublish/EzPublishKernel.php'; $kernel = new EzPublishKernel( 'dev', true ); // extends the Sf Kernel $kernel->loadClassCache(); // a method from parent $request = Request::createFromGlobals(); $response = $kernel->handle( $request ); $response->send(); $kernel->terminate( $request, $response ); The Kernel extends the Symfony HTTPKernel • It adds configuration for the Service Container • It allows to register bundles via registerBundles()
  • 38. Refactoring 38 Previous index.php had to be refactored • All logic moved into a class • 20 lines of code in index.php! • Better separation of setup and teardown of the environment from execution of application logic => • Can now be used as sub-controller • Or to run any legacy code from any New Kernel context
  • 39. Bridging legacy code 39 It is sufficient to run it in a closure • with some performance penalty
  • 40. 1.The Story 2.The Challenge 3.A New Architecture 40 Routing
  • 41. Legacy Routing 41 eZPublish 4 uses a custom MVC implementation •Front controller: index.php •Controllers are “plain php” files, properly declared •Url syntax: http:// site / module / controller / parameters •Parameters use a custom format instead of the query string •Virtual aliases can be added on top •For all content nodes, a “nice” alias is always generated by the system • Good for SEO Technical debt •No DIC anywhere (registry pattern used) •No nested controllers •No provision for REST / AJAX • Implemented ad-hoc in many plugins (code/functionality duplication) •Policies are tied to controllers, not to the underlying content model
  • 42. Seamless integration 43 The ChainRouter from the CMF project is used
  • 43. Seamless integration 44 The ChainRouter from the CMF project is used
  • 44. 1.The Story 2.The Challenge 3.A New Architecture 45 Caching
  • 45. Legacy caches 46 eZ Publish 4 has a complicated advanced caching system For viewing content, cache is generated on access, invalidated on editing • TTL = infinite • When editing a content, cache is also invalidated for all related contents • Extra invalidation rules can be configured • Can be set up to be pregenerated at editing time (tradeoff: editing speed) • Cache keys include policies of current user, query string, custom session data “Cache-blocks” can also be added anywhere in the templates • Expiry rules can be set on each block, TTL-based or content-editing based • Breaks mvc principle Most powerful AND misunderstood feature in the CMS
  • 46. Legacy caches: up to eleven 47 Historically: built-in “full-page cache” (stores html on disk) Currently deprecated, in favour of using a caching Reverse Proxy • Performances same if not better • Delegate maintenance of part of the stack (Varnish, Squid) Holy grail of caching: high TTL and support for PURGE command 1. When RP requests page from server, he gets a high TTL => cache page forever 2. When page changes, server tells to RP to purge that url from cache • Best reduction in number of requests to server while always showing fresh data • Downside: extremely hard to cache pages for connected users ESI support as well • Hard to make efficient, as eZ can not regenerate an ESI block without full page
  • 47. Legacy caches: up to eleven 48 Historically: built-in “full-page cache” (stores html on disk) Currently deprecated, in favour of using a caching Reverse Proxy • Performances same if not better • Delegate maintenance of part of the stack (Varnish, Squid) Holy grail of caching: high TTL and support for PURGE command 1. When RP requests page from server, he gets a high TTL => cache page forever 2. When page changes, server tells to RP to purge that url from cache • Best reduction in number of requests to server while always showing fresh data • Downside: extremely hard to cache pages for connected users ESI support as well • Hard to make efficient, as eZ can not regenerate an ESI block without full page
  • 48. Integration Wholesale Replacement 49 Symfony has one of the nicest caching systems for web apps Because it adopts the HTTP model HTTP Expiration and Validation are used • By setting caching headers on response object Integrates with a Gateway Cache (a.k.a. Reverse Proxy) • Native (built-in, php) $kernel = new Kernel('prod', false); $kernel = new HTTPCache($kernel); • External (Varnish, Squid, ...) Native support for ESI • Using {{ render_esi() }} in twig
  • 49. 1.The Story 2.The Challenge 3.A New Architecture 50 Reapingthe benefits
  • 50. REST API 51 eZ4 has an incomplete REST API •Only functionality available: reading content •Based on Zeta Components MVC component => A new API has been implemented •Full reading and writing of content is possible •All “dictionary” data is also available •Content-type for response can be JSON or XML (with an XSD!) •Fully restful • Usage of all HTTP verbs (and then some: PATCH) • Respect http headers of request (eg: “Accept”) • HATEOAS: use urls as resource ids •No separate request handling framework needed: pure Symfony routing
  • 51. Database Access Layer 52 • eZPublish 4 comes with its own DBAL • The Content Engine was rewritten on top of Zeta Components Database (before Symfony adoption) • Dwindling development • Shaky support for Oracle, MS SQLServer, etc • Most Symfony apps use Doctrine • Fast enough (not the ORM) • Good support for many databases => • Adopt Doctrine • Write a stub layer implementing Zeta DB API on top of it
  • 52. Improving performances 53 • The queries generated by eZPublish 4 have been hand tweaked for years • The new Content Engine not so much • Designed to run on non-sql storage • Many more layers of separation • Generated queries are suboptimal => • Introduce a Content Cache • Built using Stash (www.stashphp.com) • Multiple storage backends • Fully tested
  • 53. Improving performances 54 • The queries generated by eZPublish 4 have been hand tweaked for years • The new Content Engine not so much • Designed to run on non-sql storage • Many more layers of separation • Generated queries are suboptimal => • Introduce a Content Cache • Built using Stash (www.stashphp.com) • Multiple storage backends • Fully tested
  • 54. Templating 55 • eZPublish 4 comes with its own template language • Syntax similar to Smarty • Compiler has very limited capabilities • Support in IDEs is spotty • Symfony comes with TWIG template engine • Fast enough • Good way to support inheritance • Extensible => • Adopt TWIG • Implement custom helpers (filters / tag / functions)
  • 55. Managing Assets 56 • eZPublish 4 comes with its own assets plugin • Minifies and compresses CSS, JS • Doubles as core plugin for all things AJAX • Hard dependency on JQuery and YUI versions • No support for LESS,SASS, etc… => • Adopt Assetic • Currently working on: support for multiple site themes
  • 56. Community Bundles 57 Replacing - and improving - existing functionality • csrf token Symfony • Reverse Proxy integration FosHttpCacheBundle • Image manipulation LiipImagineBundle • Pagination WhiteOctoberPagerFanta • Menu building KnpMenuBundle • Breadcrumbs BreadcrumbsBundle • IO/storage LeagueFlysystem
  • 57. Testing 58 eZ4 has an incomplete test suite • No unit testing • Selenium for functional testing • Jenkins as CI server • Manual labour still involved • High maintenance cost => • Phpunit for unit testing • 100% API Coverage is the goal • Behat for all the rest • Travis for good platform coverage
  • 58. Testing 59 eZ4 has an incomplete test suite • No unit testing • Selenium for functional testing • Jenkins as CI server • Manual labour still involved • High maintenance cost => • Phpunit for unit testing • 100% API Coverage is the goal • Behat for all the rest • Travis for good platform coverage
  • 59. The story so far 60 • First release: November 2012 • 8 major releases • Legacy Kernel not included anymore since 2015 • New modern Administration UI in beta • Will be launched as eZ Platform this fall • Good collaboration with the Symfony ecosystem
  • 60. We’ll be here all night 61 THANK YOU <link to slideshare> • @gggeek • @declemo • www.kaliop.co.uk • www.ez.no • share.ez.no • doc.ez.no • github.com/ezsystems
  • 61. And Now For Something Completely Different 62

Editor's Notes

  1. Why so many slides instead of deep dive into code? 1: Sf docs are very good; 2: developers like to focus on code, sometimes they miss the big picture
  2. What do paying customers want? Two things: features and stability. Regardless of any contradictions.
  3. What do paying customers want? Two things: features and stability. Regardless of any contradictions.
  4. What do paying customers want? Two things: features and stability. Regardless of any contradictions.
  5. And that is Risky Business
  6. Enterprise icecream: everything AND the kitchen sink
  7. Pretty advanced concepts for the time it was designed
  8. This is what people think about when you say “old code”
  9. But what are the real problems? Also: Hard to use it as content repository (integrating it where it is not the frontend app) Multiple caching layers implementations Multiple rest-ish implementations
  10. In one word: solid (and oldie)
  11. At the same time, it is hard to onboard new developers (island syndrome)
  12. Battle tested == good security track record
  13. The first point rules out any other development language than PHP, really. Funnily enough, the choice to stay with PHP was challenged as recently as this year
  14. Home made : Why would we do that ? So much work for what ? Doing the same mistakes as in the past, just because otherwise it would be «not invented here» ? No Zeta Components : eZ has a long story with them. Back in 2008-2009, their destiny was to become the next generation of eZ Publish. For several reasons it didn’t happen. And to be pragmatic, it would have been a lot of work to adapt them to work with DI or HMVC ZF2 : Still immature at the time Then Symfony2 looked as an obvious and reasonable choice. Furthermore it’s heavily used, has a very active and nice community, and easy to learn. Let’s do it !
  15. eZ Publish 3 business case (2003). Major change => eZ Publish lost the 2/3rd of its users, community members... Because there was no BC at all
  16. For reference: eZP came with 2 releases per year, supported for 3 years each. That makes 6 versions in support at any given time
  17. More layers on the right: enforcing stricter separation
  18. Note that we use ‘ezpublish’ directory instead of ‘app’. This was discussed with and approved by SensioLabs
  19. The Legacy Kernel had a clear separation of directory structure between the Core and the Extensions. This turned out to be unnecessary and a hurdle for newcomers: one more thing to learn
  20. The Legacy Kernel had a clear separation of directory structure between the Core and the Extensions. This turned out to be unnecessary and a hurdle for newcomers: one more thing to learn
  21. Keeps our friend Jordi Boggiano happy
  22. This is slightly simplified, the actual code has a few more lines for dealing with caches, environments and reverse proxies
  23. The closure is needed to set up the ‘legacy execution environment’: Moving the execution to a different run directory Setting up all the global variables (there are many of those)
  24. Compatibility requirement: be able to execute legacy modules Bonus: added collaboration between projects
  25. Keeping Lukas Kahwe Smith happy
  26. If all of this sounds weird, it is because it is weird
  27. Bonus points: a client for the REST API, implements the same interfaces exposed by the local PHP API – network transparency!!!
  28. And of course, the sql queries are getting improved as well in the meantime
  29. Keeping Sebastian Bergmann happy