1. Practical ZF1 to ZF2 Migration:
Lessons from the Field
Clark Everetts,
Zend Technologies, Inc.
2. 2
What are we going to talk about?
Getting from Here to Here
Higher-Level
(ROI, Organizational, Planning, Goals, Constraints)
Lower-Level
(Coding Suggestions, Tools, Resources, Best Practices)
Suggestions / Best Practices
3. 3
•Clark Everetts
– Professional Services Consultant for Zend Technologies
– Onsite and Remote Consulting – Linux, IBM iSeries, Windows
●
Software Architecture Audits and Code Reviews
●
Performance Audits
●
Continuous Delivery Assessments
– Online / Onsite Training in PHP, ZF, Studio, Server, etc.
– SmartStarts: Training and Onsite Guided Development
•Past Life: Independent Consultant (2002 - 2012)
– Web Sites and Web Applications
– Contract Instructor for Zend
•Past, Past Life: Contractor for US Army and NASA (1990 - 2002)
– Interceptor Ground Control Software; Green Screen Db Applications
– Space Station: Real-time, Embedded Software; Science Platforms,
Life Support
Who am I?
4. 4
•Your role: Manager, developer, stakeholder/decision-maker?
•Size: Small to large companies; small to large dev teams
•Have you migrated applications from ZF1 to ZF2?
•Migrating now? How far along in the process are you?
•What challenges did you face / are you facing?
•What tools did you use, or wish existed?
•What did you do before you started?
•Did you expect to accomplish anything besides “the
migration?”
Who are You?
5. What (I think) You Want to Know
•Available Tools? How much do they do?
•Low-hanging fruit; most difficulties?
•Cost/Benefit? Expected gains?
– Short-term?
– Long-term?
– When not to migrate?
•How to plan a migration; what factors affect the planning?
•Developer skills / skill levels required?
•Budget, schedule is expected for a given project size?
•Other resources?
8. 8
•Write new ZF2 application from scratch?
•Run ZF1 and ZF2 side-by-side?
– Use ZF2 components in existing ZF1 application
– Use ZF1 components in new ZF2 application
– Some URLs (existing capabilities) ZF1, with other URLs
(entirely new features) implemented in ZF2
– Convert models, controllers, utility functions, helpers,
etc.
•Which ZF2 components are easiest to use in a ZF1 app?
Decisions, decisions...
9. More Decisions!
•New URLs for new features of application: can do in ZF2, but will likely rely
upon existing ZF1 models, helpers, etc., especially if you took the effort to
make those components reusable in the first place
•Build and test ZF2 version and then cut over from old site to new one, or
iterate existing ZF1 production site into a new ZF2-based site?
•Select a minimum PHP version
– PHP 5.3.3 is minimum for ZF2; current are 5.5.4 and 5.4.20. PHP
5.3.27+ will receive only security fixes through much of 2014 (Zend
supports PHP 5.2 for Enterprise customers on particular product
versions; will continue to support PHP 5.3)
– Consider most recent PHP version you can; this implies parallel
migrations (PHP version as well as ZF2), Look at
http://php.net/ChangeLog-5.php for removal of /changes to legacy
features and new capabilities
– Consider impact to other PHP apps on the server
10. 10
No One Migration Strategy to Rule Them All
There is no single, one-size-fits all, “correct” migration path for all
applications and organizations.
Many factors, including project size, team size and experience with ZF1
and ZF2, structure and quality of the ZF1 codebase, all affect the path to
take.
* http://ligh7bulb.deviantart.com/
*
11. Remember the Planned Migration Layer?
•Remember the planned Migration Layer?
– Was to allow ZF1 code to run on the ZF2 “engine”
– Work started during ZF2 betas; too much change between beta
releases to keep such a tool current
– Emulating ZF1 behaviour in ZF2 would have taken unacceptable
amount of developer time away from ZF2 development
•Though many people desired it, a full Migration Layer isn't strictly necessary
– PHP 5.3 Namespaces
– Migration: tedious, but not as hard as you think
●
Depends on the code you're starting with!
●
Fat controllers w/ data access, business logic, HTML :-(
12. Some Tools Exist to Help
•ZF2 Documentation Page
http://framework.zend.com/manual/2.2/en/migration/overview.html
●
GitHub: EvanDotPro/zf-2-for-1
ZF2 Form View Helpers, could be extended to other features
• GitHib: prolic/HumusMvcSkeletonApplication
integrates ModuleManager and ServiceManager into ZF1 application
See http://www.sasaprolic.com/2012/10/when-migration-to-zend-
framework-2.html
13. 13
ZF1 Compatibility Module - Overview
•Custom ZF2 Module that you write – simple, straightforward
•Use existing ZF1-based application resources with minimal
initial code rewrite:
– Database
– Translation
– Session
•That is, Any Zend_Application_Resource plugin
•Obtain and use these resources as ZF2 Services via
ServiceManager
•Only for Application-wide, “global” resources
15. 15
•What you do depends on what you want
– Delay a complete rewrite
●
Phased approach, reusing much of your ZF1 code
– Refactor and clean up “bad” code
•Smaller Application, perhaps non mission-critical
– Rewrite, use as a learning experience for a larger
migration effort
Planning
16. 16
// config/application.config.php
'modules' => array(
'Application',
'Zf1', // <-- your ZF1 compatibility module
// you will add other modules to the list as you
progress
),
// remainder of config array
ZF1 Compatibility Module – Add Module to config
17. 17
// module/Zf1/Module.php
namespace Zf1;
use ZendModuleManagerFeatureAutoloaderProviderInterface;
use ZendMvcMvcEvent;
class Module implements AutoloaderProviderInterface
{
public function getAutoloaderConfig()
{
$zf1path = getenv('ZF1_PATH'); // SetEnv in Apache vhost/.htaccess
if (!$zf1path) { throw new Exception('Define ZF1 library path'); }
/// more coming...
ZF1 Compatibility Module – Autoload ZF1 Classes
20. 20
ZF1 Compat. Module – Factories to Create Services
namespace Zf1ServiceFactory;
use ZendServiceManager;
class Database implements ServiceManagerFactoryInterface {
public function createService(
ServiceManagerServiceLocatorInterface $serviceLocator
)
{
$config = $serviceLocator->get('config');
$adapter = Zend_Db::factory(
$config['zf1-db']['adapter'],
$config['zf1-db']['params']
);
return $adapter;
}
}
21. 21
ZF1 Compatibility Module – Register the Services
// module/Zf1/Module.php
public function onBootstrap(MvcEvent $e)
{
$services = $e->getApplication()->getServiceManager();
$dbAdapter = $services->get('zf1-db');
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
// Perhaps your views need config. For now, in views, access config
// directly via registry. Later, use code that injects config into view
$config = $services->get('config');
Zend_Registry::set('config', Util::arrayToObject($config));
// In audits, we often find ZF1 models accessing the db via registry
// What you see here is not “best practice,” but a baby step toward
// injecting this dependency in a later phase of migration
$database = $services->get('zf1-db');
Zend_Registry::set('database', $database);
$services = $e->getApplication()->getServiceManager();
Zend_Registry::set('session', $services->get('auth')->getStorage()-
>read());
}
22. 22
ZF1 Compatibility Module – Review
•Temporary, stop-gap measure for reusing ZF1 resources
•Avoids major up-front rewrite
•Obtain and use these resources as ZF2 Services via
ServiceManager:
– Add it to the list of modules used by your ZF2 app
– Set up autoloading to find ZF1 library
– Identify Resources as Services to the ServiceManager
– Write Factories to create the services
– Register the Services
•Only for Application-wide, “global” resources
•Remember: This Module will GO AWAY in a later phase!