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
Requires
- php: ^8.2|^8.3|^8.4
- symfony/config: ^7.0|^8.0
- symfony/dependency-injection: ^7.0|^8.0
- symfony/framework-bundle: ^7.0|^8.0
- symfony/http-kernel: ^7.0|^8.0
- symfony/security-bundle: ^7.0|^8.0
Requires (Dev)
- phpunit/phpunit: ^11.0
- symfony/phpunit-bridge: ^7.0|^8.0
This package is auto-updated.
Last update: 2026-01-30 17:47:04 UTC
README
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
AbstractBundlepattern - ๐ฏ 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
- ๐ Bug Reports: GitHub Issues
- ๐ก Feature Requests: GitHub Issues
- ๐ง Email: bachir@creativspeed.com
โญ Show Your Support
If you find this bundle helpful, please consider giving it a โญ on GitHub!
Made with โค๏ธ by CreativSpeed