Extending the TaskRunner

February 27, 2023 ยท View on GitHub

Events

It is possible to hook in to GrumPHP with events. Internally the Symfony event dispatcher is being used.

The following events are triggered during execution:

Event nameEvent classTriggered
grumphp.task.runTaskEventbefore a task is executed
grumphp.task.failedTaskFailedEventwhen a task fails
grumphp.task.completeTaskEventwhen a task succeeds
grumphp.runner.runRunnerEventbefore the tasks are executed
grumphp.runner.failedRunnerFailedEventwhen one task failed
grumphp.runner.completeRunnerEventwhen all tasks succeed
console.commandConsoleCommandEventbefore a CLI command is ran
console.terminateConsoleTerminateEventbefore a CLI command terminates
console.exceptionConsoleExceptionEventwhen a CLI command throws an unhandled exception.

Configure events just like you would in Symfony:

# grumphp.yml
services:
    listener.some_listener:
        class: MyNamespace\EventListener\MyListener
        tags:
            - { name: grumphp.event_listener, event: grumphp.runner.run }
            - { name: grumphp.event_listener, event: grumphp.runner.run, method: customMethod, priority: 10 }
    listener.some_subscriber:
        class: MyNamespace\EventSubscriber\MySubscriber
        tags:
            - { name: grumphp.event_subscriber }

Register a RunnerMiddleware

A runner middleware can be used to adjust how a set of tasks is being executed. Examples are: resorting tasks, filtering tasks, logging, .... A runner middleware can be written by implementing the RunnerMiddlewareInterface.

Example:

use GrumPHP\Runner\Middleware\RunnerMiddlewareInterface;
use GrumPHP\Collection\TaskResultCollection;
use GrumPHP\Runner\TaskRunnerContext;

class PassThroughMiddleware implements RunnerMiddlewareInterface
{
    /**
     * @param callable(TaskRunnerContext $info): TaskResultCollection $next
     */
    public function handle(TaskRunnerContext $context, callable $next): TaskResultCollection
    {
        return $next($context);
    }
}

Configuration:

# grumphp.yml
services:
    PassThroughMiddleware:
        tags:
            - { name: 'grumphp.runner_middleware', priority: 500 }

Register a TaskHandlerMiddlewareInterface

A task handler middleware can be used to adjust how to run one single task. Examples are: event dispatching, caching, logging, ... A runner middleware works Asynchronous in order to allow parallel execution and can be written by implementing the TaskHandlerMiddlewareInterface. You need to return an amp promise object.

Example:

use GrumPHP\Runner\TaskHandler\Middleware\TaskHandlerMiddlewareInterface;
use GrumPHP\Runner\TaskResultInterface;
use GrumPHP\Runner\TaskRunnerContext;
use GrumPHP\Task\TaskInterface;

class PassThroughTaskHandlerMiddleware implements TaskHandlerMiddlewareInterface
{
    /**
     * @param callable(TaskInterface, TaskRunnerContext): Promise<TaskResultInterface> $next
     * @return Promise<TaskResultInterface>
     */
    public function handle(TaskInterface $task, TaskRunnerContext $runnercontext,callable $next): Promise
    {
        return $next($task, $runnercontext);
    }
}

Configuration:

# grumphp.yml
services:
    PassThroughTaskHandlerMiddleware:
        tags:
            - { name: 'grumphp.task_handler', priority: 500 }