Building Modern Single-Page Applications with Laravel and Inertia
Learn how to build modern single-page applications with Laravel, Inertia, and a frontend framework such as React, Vue, or Svelte.
You can use Inertia to build modern single-page applications with Laravel and a frontend framework such as React, Vue, or Svelte. Inertia acts as a bridge between Laravel and your frontend framework: Laravel handles the server-side work, while Inertia lets you deliver a rich client-side experience without building a separate API-first frontend.
Why build a modern single-page application in the first place? Because it can provide a faster, smoother user experience. Users can move through the application and complete actions without full page reloads, which makes the interface feel more responsive. These applications can also reduce unnecessary data transfer, helping users spend less time waiting.
Inertia Installation
You can install Inertia in a few different ways: with Laravel Jetstream, with Laravel Breeze, or manually. Jetstream and Breeze both let you start from a ready-made stack. In this example, we will use Laravel Breeze.
First, install Laravel Breeze with Composer:
composer require laravel/breeze --dev
Then install and set up Breeze:
php artisan breeze:install
php artisan migrate
npm install
npm run dev
During the Breeze installation, Laravel will ask which stack you want to use. Choose the option that fits your project. Since this example uses React, select "React with Inertia".
Routes and Controller
Here is a simple route and controller structure.
web.php
Route::get('/', [PageController::class, 'home'])->name('home');
PageController.php
<?php
namespace App\Http\Controllers;
use App\Models\Form;
use Illuminate\Http\Request;
use Inertia\Inertia;
class PageController extends Controller
{
public function home(Request $request)
{
$data["form"] = Form::with('programs')->get();
return Inertia::render('Home', $data);
}
}
Home.js
import { Layout } from "@/Layouts";
import { usePage } from "@inertiajs/react";
export default function Home({ form }) {
return (
<Layout>
<div className="flex flex-1 w-full max-w-screen-lg flex-wrap gap-8">
{form?.map((form, index) => {
return (
<div
key={index}
className="flex flex-1 w-full max-w-screen-sm flex-col gap-8 p-12 rounded-md bg-white"
>
{form.name}
</div>
);
})}
</div>
</Layout>
);
}
The request lifecycle in the example above looks like this:
Request -> Routing -> PageController -> Inertia::render -> Home.js -> Response
In other words, a request to "/" is routed to the home method on PageController. Inside that method, the form data is loaded and passed to the Home component through Inertia::render.
The Home component receives the form prop and displays the form data on the screen. This is a simple example, but the same pattern can scale to more complex Laravel applications.
For example, instead of refreshing the page after every form submission, you can use Inertia Forms with the useForm hook. That gives you form submissions without full page reloads while still keeping Laravel behind the application. React and Inertia handle the interactive frontend, and Laravel remains responsible for the backend logic.
Conclusion
If you are building a monolithic Laravel application but still want the experience of a modern single-page app, Inertia is a strong option. It connects Laravel with your frontend framework so you can keep server-side logic in Laravel while building a more dynamic frontend. The result is a Laravel application that feels faster, is easier to structure, and provides a better user experience.
For more information, visit the Inertia website.
Happy coding.