Installation:
composer require moo/flashcard
php artisan package:discover
php artisan migrate
Verify migrations added flashcards_categories and flashcards_cards tables.
First Use Case:
$category = \Moo\Flashcard\Models\Category::create(['name' => 'Programming']);
$card = \Moo\Flashcard\Models\Card::create([
'question' => 'What is Laravel?',
'answer' => 'A PHP framework',
'category_id' => $category->id
]);
Test API:
GET /api/categoriesGET /api/cards?include=categoryCRUD via API:
/api/cards and /api/categories endpoints for RESTful operations.POST /api/cards
{
"question": "Laravel ORM?",
"answer": "Eloquent",
"category_id": 1
}
Filtering & Inclusion:
GET /api/cards?filter[category_id]=1
GET /api/cards?include=category
Custom Search:
custom filter:
GET /api/cards?filter[custom]=laravel
Model Integration:
Moo\Flashcard\Models\Card or Category for custom logic:
use Moo\Flashcard\Models\Card;
class ExtendedCard extends Card {
public function getFormattedQuestion() {
return strtoupper($this->question);
}
}
Seeding:
php artisan vendor:publish --provider="Moo\Flashcard\FlashcardServiceProvider"
Database\Seeders\FlashcardSeeder:
$category = Category::create(['name' => 'Testing']);
Card::create([
'question' => 'What is TDD?',
'answer' => 'Test-Driven Development',
'category_id' => $category->id
]);
API Resource Customization:
php artisan vendor:publish --tag=flashcard-config
Moo\Flashcard\Http\Resources\CardResource in config/flashcard.php:
'resources' => [
'card' => \App\Http\Resources\CustomCardResource::class,
]
Authentication:
auth:api):
Route::middleware('auth:api')->group(function () {
Route::apiResource('cards', \Moo\Flashcard\Http\Controllers\CardController::class);
});
Frontend Integration:
axios or fetch to consume API:
axios.get('/api/cards?include=category')
.then(response => console.log(response.data.data));
Testing:
$response = $this->getJson('/api/cards');
$response->assertStatus(200)
->assertJsonStructure([...]);
Deprecated Package:
API Versioning:
/v1/cards) if needed.Pagination:
lengthAwarePaginator; customize in config/flashcard.php:
'pagination' => [
'default' => 15,
'max' => 100,
]
Database Schema:
category_id is nullable on cards table. Add constraints if needed:
$table->foreignId('category_id')->constrained()->nullable();
CORS Issues:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Header;
Header::set('Access-Control-Allow-Origin', '*');
API Errors:
storage/logs/laravel.log for validation or query errors.config/flashcard.php:
'debug' => env('FLASHCARD_DEBUG', false),
Route Conflicts:
php artisan vendor:publish --tag=flashcard-routes
routes/flashcard.php if conflicts arise.Performance:
question/answer columns for custom searches:
Schema::table('flashcards_cards', function (Blueprint $table) {
$table->index('question');
$table->index('answer');
});
Custom Fields:
flashcards_cards table (e.g., difficulty, tags):
Schema::table('flashcards_cards', function (Blueprint $table) {
$table->string('difficulty')->nullable();
$table->json('tags')->nullable();
});
Card model to cast fields:
protected $casts = [
'tags' => 'array',
];
Event Listeners:
use Moo\Flashcard\Events\CardCreated;
CardCreated::listen(function ($event) {
Log::info("New card created: {$event->card->question}");
});
Service Providers:
$this->app->bind(
\Moo\Flashcard\Repositories\CardRepository::class,
\App\Repositories\CustomCardRepository::class
);
Testing Utilities:
trait CreatesFlashcards {
public function createCard(array $data = []) {
return \Moo\Flashcard\Models\Card::create([
'question' => 'Test Question',
'answer' => 'Test Answer',
'category_id' => 1,
...$data,
]);
}
}
How can I help you explore Laravel packages today?