waaseyaa/inertia
| Install | |
|---|---|
composer require waaseyaa/inertia |
|
| Latest Version: | v0.1.0-alpha.208 |
| PHP: | >=8.5 |
| License: | GPL-2.0-or-later |
| Last Updated: | Jun 12, 2026 |
| Links: | GitHub · Packagist |
waaseyaa/inertia
Optional / experimental — not the primary workspace UI. Per charter directive DIR-007 (
.kittify/charter/charter.md), the committed workspace UI is the Nuxt SPA inpackages/admin/. This L6 adapter is supported for distributions that prefer server-driven UI, but is not bundled bywaaseyaa/full.
Layer 6 — Interfaces
Server-side Inertia.js v3 protocol adapter. A controller returns
Inertia::render($component, $props), producing an InertiaResponse that carries the
Inertia page object. InertiaMiddleware reads the X-Inertia-* headers to tell an
initial full-page load (HTML via RootTemplateRenderer) from an XHR navigation (JSON
page object), and returns 409 + X-Inertia-Location on an asset-version mismatch.
OptionalProp / PropResolver defer expensive props so partial reloads (only /
except) recompute only requested keys. Implements the foundation contracts
InertiaPageResultInterface and InertiaFullPageRendererInterface.
Install
Ships in the waaseyaa/framework metapackage but is not pulled in by waaseyaa/full;
add it explicitly: composer require waaseyaa/inertia. Register
Waaseyaa\Inertia\InertiaServiceProvider (auto-discovered via extra.waaseyaa.providers)
to wire the renderer and HTTP middleware.
Key API
// Inertia — static response factory + shared-prop / version state.
Inertia::setVersion(string $version): void
Inertia::getVersion(): string
Inertia::setRenderer(RootTemplateRenderer $renderer): void
Inertia::getRenderer(): RootTemplateRenderer
Inertia::share(string $key, mixed $value): void
Inertia::render(string $component, array $props, bool $encryptHistory = false, bool $clearHistory = false): InertiaResponse
Inertia::reset(): void
// InertiaResponse implements InertiaPageResultInterface — readonly: component, props,
// url, version, encryptHistory, clearHistory, preserveFragment, and the
// deferred/merge/prepend/deepMerge/once prop sets.
public function toPageObject(): array
// InertiaMiddleware — #[AsMiddleware(pipeline: 'http', priority: 20)]
public function __construct(string $version)
public function process(Request $request, HttpHandlerInterface $next): Response
// PropResolver
public static function optional(\Closure $callback): OptionalProp
public function resolve(array $props, array $only = [], array $except = []): array
// RootTemplateRenderer implements InertiaFullPageRendererInterface
public function __construct(?\Closure $template = null, ?ViteAssetManager $assetManager = null)
public function render(array $pageObject): string
// InertiaServiceProvider implements HasMiddlewareInterface
public function register(): void
public function registerWithRoot(?string $root): void
public function middleware(EntityTypeManager $entityTypeManager): array
Usage
Inertia::setVersion('abc123');
Inertia::share('auth', fn() => ['user' => currentUser()]);
$response = Inertia::render('Users/Index', ['users' => [1, 2, 3]]);
$page = $response->toPageObject();
Page props override shared props of the same key; shared closures resolve fresh per
render(); toPageObject() always injects props.errors.