When you inherit a PHP application that has been running for over a decade, stability and technical debt often grow together.
That was the situation with the Historical Text Archive (HTA), a long-running content site containing hundreds of historical articles, primary sources, and educational material.
Over time, the original codebase became harder to maintain, harder to extend, and increasingly difficult to integrate with modern tooling.
Rather than continue patching the legacy system, we decided to modernize the platform using Laravel 12 while preserving the data structure and URLs that search engines already trust.
HTA is publicly available here:
https://historicaltextarchive.org
Goals of the Migration
We wanted to improve:
- maintainability
- security
- search functionality
- extensibility
- performance
- developer experience
while keeping:
- existing URLs intact
- article IDs stable
- database structure understandable
- SEO authority preserved
Challenges of Legacy PHP
The original application was built more than 10 years ago using procedural PHP and a MySQL database.
Common issues we encountered:
- mixed business logic and presentation
- limited separation of concerns
- manual SQL queries everywhere
- inconsistent naming conventions
- limited testability
- difficulty adding new features
- older authentication approach
Despite these limitations, the schema itself was solid. The database structure had aged well, making it a good candidate for migration.
Migration Strategy
Instead of rewriting everything at once, we focused on incremental modernization.
High-level approach:
- export existing database schema
- generate Laravel migrations from schema
- generate Eloquent models
- replicate core functionality
- preserve routes and URLs
- add modern features
- improve search capabilities
This approach reduced risk and allowed the application to remain functional during development.
Step 1: Converting SQL Schema into Laravel Migrations
We started with a schema.sql dump from the legacy application.
From there we generated Laravel migration files that recreated the structure in a fresh database.
Benefits:
- version controlled schema
- easier onboarding for future developers
- consistent database structure across environments
- rollback capability
Example migration:
Schema::create('articles', function (Blueprint $table) {
$table->increments('artid');
$table->integer('secid')->index();
$table->string('title');
$table->date('published')->nullable();
$table->text('body');
});
Step 2: Generating Eloquent Models
Once migrations were in place, we created Eloquent models for each major table.
Example:
class Article extends Model
{
protected $primaryKey = 'artid';
protected $fillable = [
'title',
'secid',
'published',
'body'
];
public function section()
{
return $this->belongsTo(Section::class, 'secid');
}
}
Benefits:
- structured ORM relationships
- simplified queries
- reusable logic
- easier refactoring
Step 3: Preserving SEO-Friendly URLs
One of the most important requirements was preserving search engine rankings.
Many HTA articles have been indexed for years.
Breaking URLs would:
- reduce search visibility
- lose backlinks
- create poor user experience
We maintained existing routes wherever possible:
Route::get('/articles/{artid}/{slug?}', [ArticleController::class, 'show']);
This allowed legacy URLs to continue working without redirects.
Step 4: Improving Search
Search is central to any archive.
The legacy system used simple SQL queries which worked but were limited.
Laravel makes it easier to:
- expand search fields
- add filters
- build indexing logic
- support future AI categorization
Example search query:
Article::query()
->where('title', 'like', "%{$search}%")
->orWhere('body', 'like', "%{$search}%")
->paginate(20);
Future improvements may include:
- full text indexing
- semantic search
- tagging automation
- historical topic clustering
Step 5: Modern Development Workflow
Laravel provides a modern toolkit:
- migrations
- artisan CLI
- blade templates
- validation rules
- routing system
- middleware
- queue support
- testing tools
Example artisan usage:
php artisan migrate
php artisan make:model Article
php artisan make:controller ArticleController
Development is now faster and more consistent.
Step 6: Preparing for Future Features
With Laravel in place, HTA can now expand into:
- newsletter automation
- "On this day in history" article discovery
- improved article categorization
- editorial workflow improvements
- API endpoints
- AI assisted tagging
- advanced search capabilities
Because the foundation is now structured, new features are significantly easier to implement.
Key Takeaways
Migrating a legacy PHP application does not require abandoning everything.
In many cases:
- the database design is still valuable
- the content is still valuable
- the domain authority is still valuable
Laravel allows modernization without losing what already works.
For HTA, the result is a platform that keeps its historical depth while gaining modern flexibility.
Live Site
https://historicaltextarchive.org
If you are working with a legacy PHP application, start with:
- database migration
- model structure
- route preservation
Modernization can happen incrementally without disrupting users.
Sometimes the best upgrade is not replacing everything, but building a better foundation underneath what already exists.
Top comments (0)