The system still has business value.
Immediate retirement is not an option and its scope cannot be rebuilt overnight.
Zend Framework
Zend Framework was absorbed into the Laminas project in early 2020. Since then nothing ships under the old name, every package is marked as abandoned and points to its Laminas counterpart. What that means for you hangs on a single number: for ZF2 and ZF3 the route to Laminas is largely mechanical. For ZF1 it does not exist, and the work there is replacement rather than migration.
The entry point is a fixed-price assessment, implementation is quoted by scope. Also for applications without documentation and without the people who built them.
Remote from Germany. Straight with me, no agency in between.
The starting point
Zend Framework 2 and 3 live on as Laminas. The move is at heart a rename: Zend namespaces become Laminas namespaces, the Composer packages become the matching Laminas packages. There is an official tool that handles most of it. That is work, but it is predictable work.
Zend Framework 1 is a different case. It reached end of life on 28 September 2016, and there is no automated route to Laminas: the migration tool explicitly covers version 2 and later only. ZF1 comes from the time before Composer, it has its own MVC, its own database layer and conventions that exist nowhere later. Anyone talking about migration here really means replacement.
On top of that comes a second problem almost every time: ZF1 applications sit on old PHP versions, often on ones that no longer receive security updates themselves. Touching both at once is the most reliable way to end up not knowing what a fault was caused by. So the two are separated: first one step, then the other.
Does any of this sound familiar?Who this is for
For CTOs and technical leaders with a productive Zend Framework application. It still carries business value while end of support, old PHP versions and fading knowledge increase risk.
Immediate retirement is not an option and its scope cannot be rebuilt overnight.
Modules, dependencies, tests and operations are mapped before choosing Laminas, Symfony or gradual replacement.
Each step should be usable in production, testable and reversible when necessary.
What I do
Which ZF version is really in there, and how clean the boundary to your own code is. That decides between two completely different projects. The result is a clear statement: mechanical migration to Laminas, or step-by-step replacement, with the effort each one carries.
The official migration tool replaces namespaces and package names across the whole codebase. What remains afterwards is manual work at the places where your own code relies on internals, plus the dependencies that have no Laminas counterpart. Every run its own commit, reviewable on its own.
With no automated route, ZF1 is replaced step by step rather than swapped out in one go. A router in front of the application, one area at a time moved to a maintained state, the old part shrinking. Every step goes live on its own and can be reversed on its own.
ZF applications rarely have tests. So before the first change characterization tests go in, recording what the system does today. Not completely, but where the work happens and where money hangs.
Almost every ZF1 application sits on a PHP version without security updates. That needs fixing, but as a step of its own with a way back of its own. Changing framework and language at the same time makes every fault impossible to trace.
At the end there is a state that has releases, security updates and developers on the market. Plus checks in the pipeline, so the gap does not open up again.
Is your application still running on Zend Framework?
Send me the key facts. You find out which of the two cases you are in before you commission anything.
How it runs
Four steps, and after the first one you know whether you are facing a migration project or a replacement project. No step assumes that you commission the next one.
ZF version, PHP version, rough size, test coverage. Read access to the repository is enough for the assessment; production access is only needed later.
An analysis of the codebase and its dependencies. The result is the verdict on which of the two cases applies, plus a list with locations, effort and an order.
A test net at the places that get touched. After that, depending on the case, the migration run or the first replaced area. Every step a commit.
Into production in stages, with a way back. At the end checks in the pipeline and a handover, so your team carries on by itself from there.
Entry offer
Starting price for the assessment. Implementation is quoted by scope, at a fixed price, before it begins.
The entry point is an assessment, not an implementation: you find out which of the two cases you are in and what it means before you have to decide on it.
What you get
What you do not get
The outcome
Laminas keeps releasing and ships security updates. The sentence "our framework is abandoned" does not come up in the next audit.
Developers with ZF1 experience are hard to find and get harder every year. A maintained state makes the position fillable again.
In ZF applications the framework is almost always the reason the PHP version cannot go up. Afterwards that reason is gone.
The tests written for the move belong to you afterwards and protect the next change just as well.
Technologies I use
Evidence
Most suppliers know the destination. With an old system, what decides the outcome is whether someone also knows the starting point: why a passage is written the way it is, and what replacing it sets off. Zend Technologies no longer exists under that name, and neither do the exams of the time. For the database side there is an Oracle certification on MySQL 5, because that is where the quieter traps sit: character sets, collations and a strict mode that starts refusing what used to pass.



Who you are talking to
I am Tim Rutte. More than 20 years in software development, and I worked with Zend Framework back when it was current. You talk to the person who touches your code, from the first call to the handover.
Common questions
It is no longer developed, since the project continued as Laminas in early 2020. One figure regularly misleads here: the meta package zendframework/zendframework did end in June 2016, but only because ZF3 moved to per-component releases. The zend components kept shipping until the end of 2019. Since the move to Laminas there are simply no more fixes, security ones included.
No. Laminas is the continuation of Zend Framework under a new name and new stewardship. For ZF2 and ZF3 the move is at heart a rename of namespaces and packages, and there is an official tool for it. Your own code stays essentially the same.
No, and that is the most important distinction on this page. The migration tool explicitly covers version 2 and later only. ZF1 reached end of life on 28 September 2016 and comes architecturally from a different era. No tool carries you across here, so the work is step-by-step replacement.
The first migration step costs from 950 euros excluding VAT and tells you what the implementation costs. Before that every number is a guess, because orders of magnitude separate the two cases: a ZF2 application can be moved in days, a ZF1 replacement runs over months. Implementation is quoted at a fixed price after the assessment.
Both are needed, but not at the same time. Changing framework and language version together means that when something breaks you no longer know which one caused it. Which step comes first depends on the case: for ZF2 and ZF3 usually the migration, for ZF1 often an intermediate step onto a PHP version that still just carries the old code.
For ZF2 and ZF3 almost never: the mechanical route to Laminas is cheaper by orders of magnitude. For ZF1 the question is fair, and the answer is still rarely a rebuild in one go. A rebuild has to reproduce behaviour nobody fully knows, while the old system keeps running and keeps changing. Step-by-step replacement puts parts into production from the first month.
Yes, and with ZF applications that is the normal case. Before the first change a net of characterization tests goes in, recording what the system does today. It covers the places that get touched and the paths that money hangs on. That net stays with you afterwards.
No. For ZF2 and ZF3 the move is a sequence of commits, rolled out like any other change. For ZF1 the replacement runs through a router in front of the application: one area at a time moves to the new state, each one deployable on its own and reversible on its own.
Other services
Modernizing grown systems step by step: strangler fig instead of a rewrite, operations untouched, every step reversible.
Learn moreFrom PHP 5.6, 7 or early 8 to a supported version, while everything keeps running: compatibility assessment, a test net, automated rewriting, staged rollout.
Learn moreFrom an old Symfony release onto a maintained branch: clear the deprecations, replace the bundles, version by version, while the system keeps running.
Learn more