crenspire/yii3-inertia

Inertia.js server-side adapter for Yii3 and any PSR-15 application
39 1
Install
composer require crenspire/yii3-inertia
Latest Version:v2.0.0
PHP:8.2 - 8.5
License:MIT
Last Updated:Sep 17, 2026
Links: GitHub  ·  Packagist

A server-side Inertia.js adapter for Yii3 and any other PSR-7/PSR-15 application. Build single-page apps with React, Vue or Svelte while keeping routing, controllers and validation in PHP.

Features

  • Inertia.js 3 protocol, with support for Inertia.js 1 and 2 clients
  • Partial reloads, and deferred, optional, always, merge, once and infinite scroll props
  • Validation errors with error bags, flash data and history encryption
  • CSRF protection for yiisoft/csrf
  • Vite tags for the dev server and production builds, with automatic asset versioning
  • Server-side rendering through a PSR-18 HTTP client
  • Zero-config setup in Yii3 through yiisoft/config
  • Stateless services, safe for RoadRunner, Swoole and FrankenPHP workers

Requirements

  • PHP 8.2 – 8.5
  • A PSR-17 HTTP factory implementation

Installation

composer require crenspire/yii3-inertia:^2.0

In a Yii3 application, the services are registered automatically. Add the middleware before the router in config/web/di/application.php:

SessionMiddleware::class,
\Crenspire\Inertia\Middleware\XsrfTokenMiddleware::class, // when using yiisoft/csrf
CsrfTokenMiddleware::class,
\Crenspire\Inertia\Middleware\InertiaMiddleware::class,
Router::class,

Create the root view at resources/views/inertia.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title data-inertia>My App</title>
    <?= $vite->reactRefresh() ?>
    <?= $vite->tags('resources/js/app.jsx') ?>
    <?= $inertia->head() ?>
</head>
<body>
    <?= $inertia->body() ?>
</body>
</html>

Then set up the frontend as described in Client-side setup.

Usage

use Crenspire\Inertia\Inertia;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

final readonly class IndexAction
{
    public function __construct(
        private Inertia $inertia,
        private UserRepository $users,
    ) {}

    public function __invoke(ServerRequestInterface $request): ResponseInterface
    {
        return $this->inertia->render($request, 'Users/Index', [
            'users' => fn () => $this->users->findAll(),
            'stats' => Inertia::defer(fn () => $this->users->statistics()),
        ]);
    }
}
import { Deferred } from '@inertiajs/react'

export default function Index({ users, stats }) {
  return (
    <>
      <UserTable users={users} />
      <Deferred data="stats" fallback={<p>Loading…</p>}>
        <Stats stats={stats} />
      </Deferred>
    </>
  )
}

Read the documentation for forms and validation, shared data, all prop types, Vite, server-side rendering, usage without Yii3, and more.

Examples

  • examples/psr15: a runnable application built only from PSR components
  • examples/yii3: files for an application created from yiisoft/app

Upgrading from 1.x

Version 2.0 is a rewrite with a new API. See the upgrade guide.

Contributing

See CONTRIBUTING.md. The documentation lives in docs and is published with GitHub Pages.

License

MIT. See LICENSE.

Related Packages

crenspire/yii2-inertia

Inertia.js v3 adapter for the Yii2 framework

44 3
yii3/inertia

Inertia.js v3 server-side integration for Yii3.

582 2
creativspeed/inertia-bundle

Modern Inertia.js integration for Symfony 8 - Build single-page applications wit...

161 0
maskulabs/inertia-yii

Yii3 integration for Inertia.js v3 with server-side rendering support, middlewar...

141 1