Building Dynamic Quiz Systems with Laravel, Livewire, and Filament
Overview
Modern web applications often require highly interactive, stateful interfaces without the overhead of a full SPA framework. This Laravel Quiz Project demonstrates how to build a robust examination system using the TALL stack. It bridges the gap between complex administrative backend tasks—like CSV question imports—and a fluid, real-time student experience featuring countdown timers and progress tracking.
Prerequisites
To implement this architecture, you need a firm grasp of PHP 8.2+ and Laravel 11/12. Familiarity with Livewire lifecycle hooks, basic AlpineJS directives, and Eloquent relationships is essential for handling the data-intensive nature of quiz attempts.
Key Libraries & Tools
- Laravel: The foundation framework.
- Livewire: Handles the dynamic quiz-taking interface without manual JS.
- Filament: A powerful admin panel used for question and category management.
- AlpineJS: Manages client-side reactivity for the timer.
- Flux UI: Provides accessible UI components like badges and progress bars.

Code Walkthrough
Interactive Quiz Component
The quiz logic resides in a Livewire component that tracks user state. Instead of standard controllers, we use the mount and boot methods to initialize services and validate student attempts.
public function boot(QuizService $quizService)
{
// Workaround for constructor property promotion in Livewire
$this->quizService = $quizService;
}
public function updatedAnswers($value, $key)
{
// Save progress to database immediately on selection
$this->quizService->saveAnswer($this->attempt->id, $key, $value);
}
Reactive Frontend with AlpineJS
We handle the countdown timer purely on the frontend to avoid unnecessary server round-trips. AlpineJS synchronizes with Livewire when the time expires.
<div x-data="{ timer: 60 }" x-init="setInterval(() => { if(timer > 0) timer-- }, 1000)">
<span x-text="timer"></span> seconds remaining
</div>
Filament Admin Integration
Administrators manage complex question types using Filament repeaters. This allows for dynamic addition of options and validation to ensure at least one correct answer exists.
Repeater::make('options')
->schema([
TextInput::make('option_text')->required(),
Toggle::make('is_correct'),
])
->rules([/* Custom validation logic */])
Syntax Notes
The project utilizes wire:model.live.debounce.500ms for answer selection. This specific pattern ensures the server is notified of the student's choice almost instantly without flooding the network with requests on every micro-interaction.
Practical Examples
This architecture fits certifications, internal corporate training modules, or educational platforms. By utilizing the Filament importer, you can migrate thousands of questions from legacy spreadsheets into a functional web app in seconds.
Tips & Gotchas
Avoid using traditional PHP constructors in Livewire components; use the boot method for dependency injection instead. Additionally, always ensure wire:key is unique within loops to prevent AlpineJS from losing track of the DOM state during live updates.

Laravel Quiz/Exam Project with Livewire
WatchLaravel Daily // 12:59