pragmarx/trivia
PragmaRX Trivia is a PHP package that ships a large collection of trivia questions/facts you can load and use in your app. Instantiate the Trivia class and fetch all entries to build games, quizzes, bots, or random “did you know?” prompts.
Installation:
composer require pragmarx/trivia
The package provides a JSON-based trivia database (~44K entries) and a generator for creating custom trivia sets.
First Use Case: Load all trivia questions in a Laravel controller or service:
use PragmaRX\Trivia;
$trivia = new Trivia();
$allQuestions = $trivia->all(); // Returns a Collection of all trivia questions
Key Classes:
PragmaRX\Trivia: Core class for accessing the database.PragmaRX\Trivia\Generator: For creating custom trivia sets (if needed).Where to Look First:
vendor/pragmarx/trivia/src/Trivia.php (Main logic).vendor/pragmarx/trivia/data/trivia.json (Raw data structure).Fetching Trivia:
// Get all questions
$questions = (new Trivia())->all();
// Get random questions (Laravel Collection methods)
$randomQuestions = $questions->random(5);
// Filter by category (if data supports it)
$scienceQuestions = $questions->where('category', 'Science');
Integration with Laravel:
Trivia class to the container for dependency injection:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Trivia::class, function () {
return new Trivia();
});
}
Now inject Trivia into controllers/services:
use PragmaRX\Trivia;
public function __construct(Trivia $trivia) {
$this->trivia = $trivia;
}
Caching: Since the dataset is static, cache the loaded questions:
public function getCachedQuestions()
{
return Cache::remember('trivia.questions', now()->addDays(7), function () {
return (new Trivia())->all();
});
}
Generating Custom Trivia:
Use the Generator class to create quizzes programmatically:
use PragmaRX\Trivia\Generator;
$generator = new Generator();
$customQuiz = $generator->generate(10, ['category' => 'History']);
API Endpoints: Create a simple API route for trivia:
Route::get('/api/trivia', function () {
return response()->json((new Trivia())->all()->toArray());
});
Blade Integration: Pass trivia to views for quizzes:
return view('quiz', [
'questions' => $this->trivia->all()->take(10)
]);
@foreach($questions as $question)
<div>{{ $question->question }}</div>
<div>{{ $question->answer }}</div>
@endforeach
Data Structure:
vendor/pragmarx/trivia/data/trivia.json to understand fields like question, answer, category, etc.{
"question": "What is the capital of France?",
"answer": "Paris",
"category": "Geography"
}
Performance:
take() or pagination:
$limitedQuestions = $trivia->all()->take(100);
Generator Limitations:
Generator class is undocumented and may not support all use cases. Test thoroughly.Outdated Package:
No Database:
Inspect Data: Dump the first question to understand the structure:
dd((new Trivia())->all()->first());
Filtering: Use Laravel Collections for filtering:
$hardQuestions = $questions->where('difficulty', 'hard');
Custom Categories: If the default categories don’t fit, preprocess the data:
$customCategories = $questions->mapWithKeys(function ($item) {
return [$item->category => $item];
});
Add Custom Fields:
Extend the Trivia class to include metadata (e.g., difficulty, tags):
class ExtendedTrivia extends Trivia
{
public function hardQuestions()
{
return $this->all()->where('difficulty', 'hard');
}
}
Database Integration:
Sync the JSON data to a database table (e.g., trivia_questions) on package install:
// In a service provider's boot method
$this->loadTriviaIntoDatabase();
API Wrapper: Create a facade for cleaner syntax:
// app/Facades/TriviaFacade.php
public static function questions()
{
return (new Trivia())->all();
}
Usage:
TriviaFacade::questions()->random(5);
Localization:
Override the JSON file with localized versions (e.g., trivia.es.json) and load dynamically:
$locale = app()->getLocale();
$path = "vendor/pragmarx/trivia/data/trivia.{$locale}.json";
No Configuration File:
The package has no .env or config file. All behavior is hardcoded.
Data Path:
The JSON file path is hardcoded in Trivia::load(). To override:
class CustomTrivia extends Trivia
{
protected function load()
{
return json_decode(file_get_contents('custom/path/trivia.json'), true);
}
}
How can I help you explore Laravel packages today?