On 12/02/2010 08:56 AM, Michael McHugh wrote:
Hi Folks,
Company I work for licenses the source code of a legacy system that has been
drip feeding updates over the last few years and I have finally been given
approval to migrate it to the Agavi framework (license allows us to change any
code).
I'm curious on any advice, tips, tricks or thoughts any others may have from
experience doing a similar thing. A couple of my ideas on this are below..
1/ The idea is to initially wrap the application in the framework and slowly
refactor/extract parts of the original code into Agavi. I was thinking of using
a default route that passed to a module/action pair of something like
Legacy/Default that simply called the appropriate legacy script.
2/ Legacy code has significant use of globals and $_POST, $_GET, $_REQUEST and
$_COOKIE variables...<shudders> so in factories.xml would need to set the
'unset_input' parameter to false on the AgaviWebRequest object. Until this was
addressed anyway.
And just to vent because I am the only coder on this project - this legacy
beast uses include('someFunction.inc') as if it were equivalent to
someFunction() ;)
Hi,
Sorry for the late reply. Indeed, I have faced this task in the past.
Migrating PHP4 applications to Agavi is, well, an interesting task. In
my case, as refactoring proceeded incrementally, a business necessity
arose to add new features and bug fixes to the new codebase that's been
refactored. So, refactoring and development of the new codebase were
done simultaneously.
Briefly, what I did is this:
1. The old application (the "source") was put under version control.
I prefer git because of its cheap branching, rebasing and other
/nice/ features.
2. A new blank application (the "destination") was created. A point
of note: the default setting of strict validation was removed from
it temporarily, as it made refactoring very inconvenient.
3. The database configuration was prepared in the destination
application to match that of the development and production
environment of the source application.
4. I've went clicking around the old application, collecting its URL
structure. This URL structure was then recreated in the
destination app's routing map, with approximated names for modules
and actions that weren't created yet. This gave me a rough layout
of the destination application. In fact, Agavi's routing was a key
mechanism in the whole refactoring endeavour.
5. I've converted the master templates, CSS layouts and other minimum
outfit so that the destination app looks and behaves
6. I've written a similar authentication system and configured
logging for the destination application. I've configured session
sharing and database so that whatever's initialized in the source
app is also accessible in destination (in my case, I had to use
the horrible PEAR DBDO/MDB2 as the source app used it for schema
and relationship management)
7. At this point the destination application resembled a refactored
skeleton for the source one, but did not carry any actual business
logic from the source application.
8. I've ported a single often used feature (an Action in Agavi terms)
into the destination application.
9. Using webserver URL rewriting and virtual hosting magic, I've
deployed the destination application along with the source one in
production under the same URL hierarchy as the source application
so that the new actions I implement overshadow the existing ones.
10. One by one, I've moved features from source to destination,
without the users being able to take note, and organizing the
priorities in such a way that newly requested features always fall
on the code that's already been ported. As features migrated, I
physically removed the code from the source application.
Eventually I've arrived to the point at which the destination
application fully replicated the existing functionality (while having a
much more consistent structure), so I could turn off the legacy codebase
entirely. At this time, I was able to start shaving the architectural
warts, features that weren't needed any more, writing validation and
unit tests. All in all, I was able to incrementally move the application
from chaos to Agavi right in front of people's eyes and no one noticed.
Notice that the key difference in my approach was that I did not "wrap"
the source application in the framework; rather I had the new
application imitate the environment of the old one, and the two were
connected through URL mappings, a shared database and a logon session
(I'm sure there was more to it than just this I just dont quite remember
the details). This proved to be a great decision as I didn't have to
muck with the old code at all; and working on rather small units of code
(usually a single Action at a time) I was able to iron out most of the
moronic idioms from the code as I went.
In any case, good luck and Ceiling Cat bless you!
_______________________________________________
users mailing list
[email protected]
http://lists.agavi.org/mailman/listinfo/users