Installation
composer require abc/job
Ensure php-enqueue (dependency) is also installed and configured for your transport (e.g., Redis, RabbitMQ).
Basic Job Definition
Create a job class implementing JobInterface:
use Abc\Job\JobInterface;
class SendEmailJob implements JobInterface
{
public function run(): void
{
// Your logic here
}
}
Dispatching a Job
Use the JobDispatcher to enqueue a job:
$dispatcher = new JobDispatcher();
$job = new SendEmailJob();
$dispatcher->dispatch($job);
First Use Case Trigger a job asynchronously in a Laravel controller:
use Abc\Job\JobDispatcher;
public function sendWelcomeEmail()
{
$dispatcher = app(JobDispatcher::class);
$dispatcher->dispatch(new SendEmailJob());
return response()->json(['status' => 'Job dispatched']);
}
Job Dispatching
JobDispatcher for one-off jobs.BatchJob or SequenceJob:
$batch = new BatchJob([new Job1(), new Job2()]);
$dispatcher->dispatch($batch);
Laravel Integration
AppServiceProvider:
$this->app->singleton(JobDispatcher::class, function ($app) {
return new JobDispatcher(new EnqueueConnection());
});
Status Tracking
JobRepository:
$repository = new JobRepository();
$status = $repository->getStatus($jobId);
Cancellation/Restart
$repository->cancel($jobId);
$repository->restart($jobId);
Scheduled Jobs
Requires AbcSchedulerBundle (2.x). Configure in config/packages/abc_scheduler.yaml:
abc_scheduler:
jobs:
send_weekly_report: '@App\Jobs\ReportJob'
schedule: '0 0 * * 1' # Every Monday at midnight
Custom Transports
Configure php-enqueue in .env (e.g., Redis):
ENQUEUE_DSN=redis://localhost
Job Composition Combine jobs dynamically:
$sequence = new SequenceJob([
new Job1(),
new BatchJob([new Job2(), new Job3()]),
new Job4()
]);
REST API Expose job status via API (uses built-in JSON REST layer):
Route::get('/jobs/{id}', [JobController::class, 'getStatus']);
Transport Configuration
php-enqueue is properly set up (e.g., Redis/RabbitMQ server running).php artisan enqueue:listeners
Job Serialization
__serialize()/__unserialize() if needed:
public function __serialize(): array
{
return ['data' => $this->data];
}
Experimental Status
Laravel Queue Conflicts
abc/job with Laravel’s native queues unless using php-enqueue as the transport.Job Logs
Enable debug mode in config/enqueue.php:
'debug' => env('ENQUEUE_DEBUG', false),
Monitoring
Use php-enqueue tools to inspect queues:
php artisan enqueue:consume --queue=default --limit=10
Status Polling Jobs may take time to appear in the repository. Add retries:
while (!$repository->getStatus($jobId)->isComplete()) {
sleep(1);
}
Custom Job Handlers
Extend JobHandler to add pre/post-processing:
class CustomJobHandler extends JobHandler
{
protected function beforeRun(JobInterface $job): void
{
// Logic before job runs
}
}
Transport-Specific Logic
Override EnqueueConnection for custom transports:
class CustomConnection extends EnqueueConnection
{
protected function createContext(): Context
{
return new CustomContext();
}
}
API Extensions
Extend the REST layer by overriding JobController or adding routes.
Event Listeners
Listen for job events (e.g., JobStarted, JobFailed) via EventDispatcher:
$dispatcher->addListener(JobStarted::class, function ($event) {
Log::info('Job started', ['id' => $event->getJob()->getId()]);
});
How can I help you explore Laravel packages today?