Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Task Manager Laravel Package

21torr/task-manager

Small wrapper around symfony/messenger that simplifies task management in PHP/Symfony apps. Helps you define, dispatch, and handle tasks with a cleaner API while keeping Messenger under the hood. Includes documentation for quick setup and usage.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Install the package:
    composer require 21torr/task-manager
    
  2. Register the bundle in config/bundles.php:
    return [
        // ...
        TaskManagerBundle::class => ['all' => true],
    ];
    
  3. Configure transports in config/packages/messenger.yaml:
    framework:
        messenger:
            transports:
                async: '%env(MESSENGER_TRANSPORT_DSN)%'
                task_manager_internals: 'doctrine://default?queue_name=task_manager_internals'
    
  4. Run migrations to create the task log tables:
    php bin/console doctrine:migrations:diff
    php bin/console doctrine:migrations:migrate
    

First Use Case: Dispatching a Task

Create a task class extending Task:

use TaskManagerBundle\Task\Task;

class SendEmailTask extends Task
{
    public function __construct(
        private string $email,
        private string $message
    ) {}

    public function run(): void
    {
        // Task logic here
        mail($this->email, 'Subject', $this->message);
    }
}

Dispatch the task via the TaskManager:

use TaskManagerBundle\TaskManager\TaskManager;

class SomeService
{
    public function __construct(private TaskManager $taskManager) {}

    public function sendEmail(): void
    {
        $task = new SendEmailTask('user@example.com', 'Hello!');
        $this->taskManager->enqueue($task);
    }
}

First Use Case: Running Workers

Start the worker process:

php bin/console task-manager:run-worker async --limit=10

Implementation Patterns

Task Registration and Discovery

  1. Automatic Registration: The bundle automatically discovers tasks via the RegisterTasksEvent. No manual registration is required for basic usage.

  2. Custom Task Metadata: Extend task metadata by implementing TaskMetadataInterface:

    use TaskManagerBundle\Task\TaskMetadataInterface;
    
    class SendEmailTask extends Task implements TaskMetadataInterface
    {
        public function getKey(): string
        {
            return 'send_email';
        }
    
        public function getDescription(): string
        {
            return 'Sends an email to the specified address';
        }
    }
    

Task Scheduling

Use the TaskScheduler for delayed or recurring tasks:

use TaskManagerBundle\TaskManager\TaskScheduler;

class SomeService
{
    public function __construct(
        private TaskScheduler $scheduler,
        private TaskManager $taskManager
    ) {}

    public function scheduleEmail(): void
    {
        $task = new SendEmailTask('user@example.com', 'Hello!');
        $this->scheduler->schedule($task, new \DateTimeImmutable('+1 hour'));
    }
}

Handling Task Results and Failures

  1. Post-Run Tasks: Use DispatchAfterRunTask to chain tasks:

    use TaskManagerBundle\Task\DispatchAfterRunTask;
    
    class SendEmailTask extends Task
    {
        public function run(): void
        {
            // Task logic
            $this->taskManager->enqueue(
                new DispatchAfterRunTask(
                    new LogEmailSentTask($this->email)
                )
            );
        }
    }
    
  2. Logging Failures: The bundle automatically logs task failures in the TaskLog table. Access logs via:

    php bin/console task-manager:log
    

CLI Workflows

  1. Queue Inspection:

    php bin/console task-manager:queue async
    
  2. Task Debugging:

    php bin/console task-manager:debug
    
  3. Log Cleanup:

    php bin/console task-manager:clean-log --days=30
    

Gotchas and Tips

Common Pitfalls

  1. Task Class Requirement: All tasks must extend TaskManagerBundle\Task\Task. Forgetting this will cause runtime errors.

  2. ULID Format: Ensure task IDs follow the ULID format (e.g., 01H5Z2X3Y4...). The bundle validates this during enqueueing.

  3. Internal Tasks: Avoid manually dispatching tasks marked as TaskManagerInternalTask. These are reserved for bundle internals.

  4. Deprecated Methods:

    • TaskLog::getTaskObject() is deprecated. Use TaskDetailsNormalizer::deserializeTask() instead.
    • Entity getter methods (e.g., getId()) are deprecated in favor of direct property access.

Debugging Tips

  1. Requeueing Tasks in Development: Use the task-manager:requeue command to reprocess failed tasks:

    php bin/console task-manager:requeue <task-id>
    
  2. Worker Memory Issues: The run-worker command defaults to handling 5 messages at a time. Increase the limit for batch processing:

    php bin/console task-manager:run-worker async --limit=50
    
  3. Log Retention: The LogCleaner runs automatically but can be triggered manually:

    php bin/console task-manager:clean-log --days=7
    

Extension Points

  1. Custom Task Handlers: Extend TaskHandlerInterface to add pre/post-processing logic:

    use TaskManagerBundle\Task\TaskHandlerInterface;
    
    class CustomTaskHandler implements TaskHandlerInterface
    {
        public function handle(Task $task, TaskRun $run): void
        {
            // Custom logic before/after task execution
        }
    }
    

    Register the handler in config/packages/task_manager.yaml:

    task_manager:
        handlers:
            - App\CustomTaskHandler
    
  2. Custom Transports: Add new transports in messenger.yaml and configure the bundle to use them:

    framework:
        messenger:
            transports:
                custom_transport: 'doctrine://default?queue_name=custom_queue'
    
  3. Event Listeners: Listen to task events (e.g., TaskEvent):

    use TaskManagerBundle\Event\TaskEvent;
    
    class TaskListener
    {
        public function onTaskRun(TaskEvent $event): void
        {
            // Handle task run events
        }
    }
    

    Register the listener in services.yaml:

    services:
        App\TaskListener:
            tags:
                - { name: 'kernel.event_listener', event: 'task.run', method: 'onTaskRun' }
    

Performance Considerations

  1. Log Cleanup: The LogCleaner runs asynchronously. For large log tables, manually trigger cleanup with a higher limit:

    php bin/console task-manager:clean-log --limit=10000
    
  2. Worker Concurrency: Adjust the MESSENGER_CONCURRENCY environment variable to control parallel task execution:

    php bin/console task-manager:run-worker async --limit=10 -e MESSENGER_CONCURRENCY=5
    
  3. Task Serialization: Complex task objects may cause serialization issues. Ensure all dependencies are serializable or use DTOs.

Configuration Quirks

  1. Hidden Internal Tasks: To exclude internal tasks from logs, configure in task_manager.yaml:

    task_manager:
        log:
            hide_internal_tasks: true
    
  2. Transport Priorities: The bundle uses task_manager_internals for internal messages. Ensure this transport is configured separately to avoid mixing with user tasks.

  3. PHP Version: The bundle requires PHP 8.5+. Downgrading may break functionality (e.g., ULID handling in v3.2.0+).

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle