Installation:
composer require moox/trainings
php artisan mooxtrainings:install
First Use Case:
use Moox\Trainings\Facades\Training;
Training::create([
'title' => 'Laravel Best Practices',
'description' => 'Advanced Laravel techniques',
'duration_hours' => 8,
]);
$trainings = Training::all();
Where to Look First:
config/trainings.php (published via vendor:publish).database/migrations/[timestamp]_create_trainings_tables.php.Moox\Trainings\Facades\Training for fluent queries.CRUD Operations:
Training facade for Eloquent-like operations:
// Create
Training::create([...]);
// Read
Training::find($id);
Training::where('duration_hours', '>', 4)->get();
// Update
Training::find($id)->update(['title' => 'New Title']);
// Delete
Training::destroy($id);
Event Integration:
TrainingCreated, TrainingUpdated) via Laravel's event system:
// In EventServiceProvider
protected $listen = [
'Moox\Trainings\Events\TrainingCreated' => [
'App\Listeners\LogTrainingCreation',
],
];
API Resources:
Resource classes:
php artisan make:resource TrainingResource
// In TrainingResource
public function toArray($request) {
return [
'id' => $this->id,
'title' => $this->title,
'duration' => $this->duration_hours,
];
}
Policy Integration:
php artisan make:policy TrainingPolicy --model=Training
// In TrainingPolicy
public function update(User $user, Training $training) {
return $user->isAdmin();
}
Queued Jobs:
use Moox\Trainings\Jobs\SendTrainingCompletionEmail;
SendTrainingCompletionEmail::dispatch($training);
Service Providers:
Extend the package's functionality by binding additional services in AppServiceProvider:
public function register() {
$this->app->bind(
'Moox\Trainings\Contracts\TrainingRepository',
'App\Repositories\CustomTrainingRepository'
);
}
Views: Share training data with Blade templates:
// In a controller
return view('trainings.show', ['training' => Training::find($id)]);
<!-- resources/views/trainings/show.blade.php -->
<h1>{{ $training->title }}</h1>
<p>Duration: {{ $training->duration_hours }} hours</p>
Testing: Use Laravel's testing helpers to mock the facade:
$this->mock(Moox\Trainings\Facades\Training::class)
->shouldReceive('find')
->andReturn($mockTraining);
Migration Conflicts:
php artisan migrate:fresh --seed
php artisan vendor:publish --tag=trainings-migrations to re-publish migrations if needed.Facade vs. Direct Model Access:
Training) may have additional methods not available on the raw Training model. Check the facade's source for undocumented features.Config Overrides:
config/trainings.php may not reflect in runtime if the package caches config. Clear the config cache:
php artisan config:clear
Event Listeners:
EventServiceProvider or a service provider. Missing listeners may cause silent failures.Database Seeding:
php artisan make:seeder TrainingsTableSeeder
// In TrainingsTableSeeder
public function run() {
\Moox\Trainings\Facades\Training::factory()->count(10)->create();
}
Query Logs: Enable Laravel's query logging to debug facade queries:
DB::enableQueryLog();
$trainings = Training::all();
dd(DB::getQueryLog());
Model Events:
Use observables to debug model events:
Training::observe(TrainingObserver::class);
// In TrainingObserver
public function saved(Training $training) {
\Log::info("Training saved: {$training->title}");
}
Package Logs: Check the package's logs (if configured) or add debug statements:
\Log::debug('Training data:', ['data' => $training->toArray()]);
Custom Attributes:
Add computed attributes to the Training model:
// In app/Models/Training.php (if extended)
public function getFormattedDurationAttribute() {
return "{$this->duration_hours} hours";
}
API Extensions: Extend the facade with custom methods:
// In AppServiceProvider
public function boot() {
\Moox\Trainings\Facades\Training::macro('search', function ($query) {
return $this->where('title', 'like', "%{$query}%");
});
}
Usage:
Training::search('Laravel')->get();
Validation Rules: Add custom validation rules for training data:
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($data, [
'duration_hours' => ['required', 'integer', 'min:1', 'max:48'],
]);
Testing Facade: Mock the facade in tests to isolate logic:
$this->partialMock(Moox\Trainings\Facades\Training::class, function ($mock) {
$mock->shouldReceive('find')->andReturn($mockTraining);
});
Localization: Extend the package's language lines by publishing translations:
php artisan vendor:publish --tag=trainings-translations
Then override in resources/lang/en/trainings.php.
How can I help you explore Laravel packages today?