Migrating PHP to React/Next.js: Strategies and Case Studies
When the PHP monolith slows down: migration to React/Next.js
Your Laravel site has started slowing down: INP over 300 ms, and adding a new page takes a week. We've encountered such projects dozens of times. Migrating to React/Next.js is not a framework change but an architecture rethink. Next.js with React Server Components (RSC) generates pages 2-3 times faster than pure PHP rendering and cuts TTFB in half. The migration pays for itself in 6-12 months through reduced hosting and development costs. Below are real strategies we've applied on 50+ projects. We guarantee preserving SEO positions during the move. Get a consultation — we'll evaluate your project in one day.
What problems does migration solve?
Performance. PHP generates HTML on the server per request, leading to high TTFB. Next.js with RSC serves static content and streams dynamic content. CLS improves thanks to server-side rendering.
Maintenance complexity. Blade templates mix logic and presentation. React with TypeScript and strict typing reduces bugs by 30% as per our measurements.
SEO issues. Client-side SPAs are poorly indexed. Next.js solves this with SSR and ISR. For example, an e-commerce store with 5000 products saw a 20% traffic increase after migration.
How to choose a migration strategy?
There are three approaches, and the choice depends on project size and acceptable downtime.
| Strategy | Essence | When to apply |
|---|---|---|
| Strangler Fig | Gradual route replacement via Nginx | Large projects, zero error tolerance |
| Big Bang | Full rewrite in one deploy | Small sites (<50 pages) |
| Hybrid | Next.js frontend, PHP API | When you want to preserve backend investments |
Strangler Fig — our favorite. We configure Nginx so new routes go to Next.js and old ones to PHP, eliminating downtime.
server { server_name mysite.com; # New routes → Next.js location /blog/ { proxy_pass http://nextjs:3000; } location /about { proxy_pass http://nextjs:3000; } # Old routes → Laravel location / { proxy_pass http://laravel:8000; } } How to prepare the project for migration
- Conduct a code audit: identify integration points, performance bottlenecks, N+1 queries.
- Choose a strategy: Strangler Fig for large projects, Big Bang for small ones.
- Set up infrastructure: Docker, CI/CD, separate environments.
- Implement gradually: test each route individually.
- Perform A/B testing and deploy.
Migrating business logic: Laravel → Zod + Prisma
One common mistake is copying validation "as is." In Laravel it's built via $request->validate, in React via Zod. We rewrite with TypeScript types in mind.
// До (Laravel) // $request->validate([ // 'email' => 'required|email|unique:users', // 'name' => 'required|min:2|max:255', // ]); // После (Zod + React Hook Form) const schema = z.object({ email: z.string().email('Некорректный email'), name: z.string().min(2).max(255), }); Database queries also change. Eloquent queries with N+1 are replaced with Prisma includes.
// До (Eloquent в Laravel) // User::where('active', true)->with('posts')->paginate(10); // После (Prisma в Next.js API Route) const users = await prisma.user.findMany({ where: { active: true }, include: { posts: true }, take: 10, skip: (page - 1) * 10, }); Templates: Blade → React components
A Blade loop template becomes a ProductCard component. This improves maintainability.
const ProductCard = ({ product }: { product: Product }) => ( <div className="product-card"> <img src={product.imageUrl} alt={product.name} /> <h3>{product.name}</h3> <span>{product.price.toLocaleString('ru-RU')} руб.</span> <Link href={`/products/${product.slug}`}>Подробнее</Link> </div> ); Authentication: PHP sessions → NextAuth
PHP sessions via Cookie are replaced with JWT tokens via NextAuth. For Laravel API we use Sanctum.
// Next.js: аутентификация через Laravel Sanctum import NextAuth from 'next-auth'; import Credentials from 'next-auth/providers/credentials'; export const { auth, handlers } = NextAuth({ providers: [ Credentials({ async authorize(credentials) { const res = await fetch(`${process.env.LARAVEL_URL}/api/auth/login`, { method: 'POST', body: JSON.stringify(credentials), headers: { 'Content-Type': 'application/json' }, }); if (!res.ok) return null; return res.json(); }, }), ], }); What's included
We deliver a complete package:
- Architecture and API documentation
- Access to repository, CI/CD, hosting
- Team training on Next.js
- One month of post-deployment support
- SEO preservation guarantee (100% redirects, zero 404s)
Timelines and cost
Cost is calculated individually after an audit. Indicative timelines:
| Site type | Strangler Fig | Big Bang |
|---|---|---|
| Corporate (10–20 pages) | 4–8 weeks | 3–6 weeks |
| Blog/portal (50–200 pages) | 8–16 weeks | 6–12 weeks |
| E-commerce store | 3–6 months | 2–4 months |
| Complex portal | 6–12 months | Not feasible |
Case study
An e-commerce site on CodeIgniter (2000 products) migrated using the Strangler Fig pattern. We first rewrote the catalog, then the cart, then the user account. Result: LCP dropped from 4.2 s to 1.1 s, traffic increased by 25%. The whole process took 4 months.
Why trust us with the migration?
Over 8 years of experience in React/Next.js migrations. Certified engineers (React, Next.js, AWS). 50+ successful projects. We guarantee your site won't lose search rankings. Contact us to get a detailed audit of your PHP project and cost estimate.
More about our experience
Over 8 years we've performed migrations for 50+ projects: from simple landing pages to high-load e-commerce stores. We use official tools: [React Server Components](https://nextjs.org/docs/app/building-your-application/rendering/server-components), Prisma, Zod. Each project is documented and we deliver a complete architectural diagram.Request a consultation — we'll analyze your project and suggest the optimal migration plan.







