creativspeed/inertia-bundle

Modern Inertia.js integration for Symfony 8 - Build single-page applications with Vue.js/React without the complexity of APIs

Installs: 1

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

Type:symfony-bundle

pkg:composer/creativspeed/inertia-bundle

v1.0.0 2026-01-30 17:37 UTC

This package is auto-updated.

Last update: 2026-01-30 17:47:04 UTC


README

Latest Stable Version Total Downloads License

Modern Inertia.js integration for Symfony 8 and PHP 8.2+. Build powerful single-page applications using Vue.js or React without the complexity of building an API.

โœจ Features

  • ๐Ÿš€ Modern Symfony 8 - Built with AbstractBundle pattern
  • ๐ŸŽฏ Zero Configuration - Works out of the box
  • ๐Ÿ”„ Automatic Auth Sharing - User data automatically available in frontend
  • โšก Partial Reloads - Only fetch data you need
  • ๐ŸŽจ Vue 3 & React Support - Use your favorite framework
  • ๐Ÿ”’ Security First - Integrates seamlessly with Symfony Security
  • ๐Ÿ“ฆ PSR-4 Autoloading - Modern PHP standards
  • ๐Ÿงช Type Safe - Full PHP 8.2+ type hints

๐Ÿ“‹ Requirements

  • PHP 8.2, 8.3, or 8.4
  • Symfony 8.0+ (also compatible with Symfony 7.0+)
  • Composer 2.0+

๐Ÿ“ฅ Installation

Install the bundle via Composer:

composer require creativspeed/inertia-bundle

If you're using Symfony Flex, the bundle will be automatically registered. Otherwise, add it manually to config/bundles.php:

<?php

return [
    // ...
    CreativSpeed\InertiaBundle\InertiaBundle::class => ['all' => true],
];

โš™๏ธ Configuration

Create config/packages/inertia.yaml:

inertia:
    # Asset versioning for cache busting (optional)
    version: '%env(default::APP_VERSION)%'
    
    # Root Twig template (optional, default: 'app')
    root_view: 'app'
    
    # Server-side rendering (optional)
    ssr:
        enabled: false
        url: 'http://127.0.0.1:13714'

๐Ÿš€ Quick Start

1. Create Root Template

Create templates/inertia/app.html.twig:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title inertia>{{ page.props.title ?? 'My App' }}</title>
    
    {{ vite_entry_link_tags('app') }}
</head>
<body>
    <div id="app" data-page="{{ page|json_encode|e('html_attr') }}"></div>
    
    {{ vite_entry_script_tags('app') }}
</body>
</html>

2. Setup Frontend (Vue 3 Example)

Install frontend dependencies:

npm install @inertiajs/vue3 vue
npm install --save-dev @vitejs/plugin-vue vite

Create assets/app.js:

import { createApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/vue3';

createInertiaApp({
    resolve: name => {
        const pages = import.meta.glob('./pages/**/*.vue', { eager: true });
        return pages[`./pages/${name}.vue`];
    },
    setup({ el, App, props, plugin }) {
        createApp({ render: () => h(App, props) })
            .use(plugin)
            .mount(el);
    },
});

3. Create Your First Page Component

Create assets/pages/Home.vue:

<template>
    <div>
        <h1>{{ title }}</h1>
        <p>Welcome to Inertia.js with Symfony 8!</p>
    </div>
</template>

<script setup>
defineProps({
    title: String
});
</script>

4. Create a Controller

<?php

namespace App\Controller;

use CreativSpeed\InertiaBundle\Service\InertiaInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class HomeController extends AbstractController
{
    #[Route('/', name: 'home')]
    public function index(InertiaInterface $inertia): Response
    {
        return $inertia->render('Home', [
            'title' => 'Hello from Symfony!'
        ]);
    }
}

๐Ÿ“– Usage Examples

Basic Rendering

return $inertia->render('Dashboard/Index', [
    'user' => $this->getUser(),
    'stats' => ['visits' => 100]
]);

Sharing Data Globally

// In a controller or event listener
$inertia->share('auth', [
    'user' => $this->getUser()
]);

Lazy Props (Partial Reloads)

return $inertia->render('Users/Index', [
    'users' => $userRepository->findAll(),
    // Only loaded when specifically requested
    'stats' => fn() => $this->calculateExpensiveStats()
]);

Redirects

// Redirect back
return $inertia->back();

// Redirect to URL
return $inertia->redirect('/dashboard');

๐Ÿ—๏ธ Architecture

This bundle uses Symfony's modern AbstractBundle pattern (Symfony 6.1+) for cleaner, more maintainable code:

  • โœ… No separate Extension class needed
  • โœ… No separate Configuration class needed
  • โœ… Everything configured in the bundle class
  • โœ… Auto-wiring and auto-configuration enabled

๐Ÿ”ง Advanced Configuration

Multiple Root Views

inertia:
    root_view: 'app'  # Default for most pages

Then override per-request:

return $inertia->render('Admin/Dashboard', $props, [
    'root_view' => 'admin'  // Use templates/inertia/admin.html.twig
]);

Asset Versioning

inertia:
    version: '1.0.0'  # Static version
    # OR
    version: '%env(APP_VERSION)%'  # From environment

Server-Side Rendering

inertia:
    ssr:
        enabled: true
        url: 'http://127.0.0.1:13714'

๐Ÿงช Testing

composer test

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

๐Ÿ“„ License

This bundle is open-sourced software licensed under the MIT license.

๐Ÿ”— Links

๐Ÿ’ฌ Support

โญ Show Your Support

If you find this bundle helpful, please consider giving it a โญ on GitHub!

Made with โค๏ธ by CreativSpeed