Installation
composer require avoo/qcm-components
Add the package to your config/app.php providers (if not auto-discovered):
'providers' => [
// ...
Avoo\QcmComponents\QcmServiceProvider::class,
],
Publish Config (Optional) If the package includes default configurations:
php artisan vendor:publish --provider="Avoo\QcmComponents\QcmServiceProvider" --tag="config"
First Use Case: Basic Model Usage
The package likely provides core QCM (Question, Choice, Model) interfaces/models. Start by inspecting the src/Models directory for classes like:
QuestionChoiceAnswerQuizExample usage in a controller:
use Avoo\QcmComponents\Models\Question;
$question = Question::create([
'title' => 'Sample Question',
'description' => 'Test description',
]);
Key Entry Points
src/Interfaces for contracts like QuestionInterface, ChoiceInterface.src/Traits (e.g., HasChoices, HasAnswers).src/Services for business logic helpers (e.g., QuizEvaluator).Question model to create questions with choices:
$question = Question::create(['title' => 'Capital of France?']);
$question->choices()->createMany([
['text' => 'Paris', 'is_correct' => true],
['text' => 'London', 'is_correct' => false],
]);
Quiz model:
$quiz = Quiz::create(['title' => 'Geography Quiz']);
$quiz->questions()->attach([$question->id]);
QuizEvaluator) to score submissions:
$score = app(\Avoo\QcmComponents\Services\QuizEvaluator::class)
->evaluate($quiz, $userAnswers);
// In Question model
public function getFormattedTitleAttribute() {
return strtoupper($this->title);
}
tags to Question):
public function tags() {
return $this->morphToMany(Tag::class, 'taggable');
}
QuestionResource) to shape responses:
namespace App\Http\Resources;
use Avoo\QcmComponents\Models\Question;
use Illuminate\Http\Resources\Json\JsonResource;
class QuestionResource extends JsonResource {
public function toArray($request) {
return [
'id' => $this->id,
'title' => $this->title,
'choices' => $this->choices,
];
}
}
Route::apiResource('questions', QuestionController::class);
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreQuizAnswerRequest extends FormRequest {
public function rules() {
return [
'question_id' => 'required|exists:questions,id',
'selected_choice' => 'required|exists:choices,id',
];
}
}
$question = Question::factory()->create();
$this->assertEquals('Paris', $question->choices->first()->text);
$response = $this->post('/api/quizzes', $quizData);
$response->assertStatus(201);
hasMany, belongsTo) with the package’s models.QuestionCreated) for side effects:
Question::created(function ($question) {
Log::info("New question created: {$question->title}");
});
class QuestionPolicy {
public function update(User $user, Question $question) {
return $user->isAdmin();
}
}
@component('qcm.question', ['question' => $question])
@slot('choices')
@foreach($question->choices as $choice)
<label>{{ $choice->text }}</label>
@endforeach
@endslot
@endcomponent
$quiz = Cache::remember("quiz:{$id}", now()->addHours(1), function () use ($id) {
return Quiz::findOrFail($id);
});
$questions = Question::with('choices', 'quiz')->get();
Question). Ensure your app’s models are namespaced properly (e.g., App\Models\Question vs. Avoo\QcmComponents\Models\Question).use Avoo\QcmComponents\Models\Question as QcmQuestion;
src/Interfaces.tests/ (if any).src/Models directory for default behaviors.php artisan make:migration create_questions_table
questions:
Schema::create('questions', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description')->nullable();
$table->timestamps();
});
AppServiceProvider:
$this->app->bind(
\Avoo\QcmComponents\Interfaces\QuizEvaluator::class,
\Avoo\QcmComponents\Services\QuizEvaluator::class
);
public function evaluate() {
\Log::debug('Evaluating quiz', ['quiz_id' => $this->quiz->id]);
// ...
}
dd($question->toArray()); // Dump and die
\Illuminate\Support\Facades\Log::debug(dump($quiz->questions));
php artisan tinker
>>> $question = \Avoo\QcmComponents\Models\Question::first();
>>> $question->choices
php artisan vendor:publish --tag="qcm-components-migrations"
namespace App\Models;
use Avoo\QcmComponents\Models\Question as BaseQuestion;
class Question extends BaseQuestion {
// Add custom logic
}
trait
How can I help you explore Laravel packages today?