master

laravel/framework

Last updated at: 29/12/2023 09:23

CallQueuedClosure.php

TLDR

This file, CallQueuedClosure.php, is part of the Illuminate\Queue namespace in the Laravel framework. It contains the implementation of the CallQueuedClosure class, which is a job that performs a closure, or anonymous function. The closure can be executed in the background using a queue and can be passed as an argument to the create method of the CallQueuedClosure class. The class also includes methods to handle job failures and get the display name for the queued job.

Methods

__construct($closure)

This method is the constructor of the CallQueuedClosure class. It initializes the $closure property with the given closure.

create(Closure $job)

This static method creates a new instance of the CallQueuedClosure class by wrapping the given closure in a SerializableClosure object. It returns the created instance.

handle(Container $container)

This method executes the closure by calling it within the given container. The closure is retrieved from the $closure property using the getClosure method of the SerializableClosure object.

onFailure($callback)

This method adds a callback to be executed if the job fails. The $callback can be either a closure or a callable. If it is a closure, it is wrapped in a SerializableClosure object before being added to the failureCallbacks array. The method returns the current instance of the CallQueuedClosure class.

failed($e)

This method is called when the job fails. It iterates over the failureCallbacks array and executes each callback, passing the exception ($e) as an argument.

displayName()

This method returns the display name for the queued job. It uses reflection to retrieve the filename and starting line number of the closure, and formats it as a string.

Classes

None

<?php

namespace Illuminate\Queue;

use Closure;
use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Laravel\SerializableClosure\SerializableClosure;
use ReflectionFunction;

class CallQueuedClosure implements ShouldQueue
{
    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * The serializable Closure instance.
     *
     * @var \Laravel\SerializableClosure\SerializableClosure
     */
    public $closure;

    /**
     * The callbacks that should be executed on failure.
     *
     * @var array
     */
    public $failureCallbacks = [];

    /**
     * Indicate if the job should be deleted when models are missing.
     *
     * @var bool
     */
    public $deleteWhenMissingModels = true;

    /**
     * Create a new job instance.
     *
     * @param  \Laravel\SerializableClosure\SerializableClosure  $closure
     * @return void
     */
    public function __construct($closure)
    {
        $this->closure = $closure;
    }

    /**
     * Create a new job instance.
     *
     * @param  \Closure  $job
     * @return self
     */
    public static function create(Closure $job)
    {
        return new self(new SerializableClosure($job));
    }

    /**
     * Execute the job.
     *
     * @param  \Illuminate\Contracts\Container\Container  $container
     * @return void
     */
    public function handle(Container $container)
    {
        $container->call($this->closure->getClosure(), ['job' => $this]);
    }

    /**
     * Add a callback to be executed if the job fails.
     *
     * @param  callable  $callback
     * @return $this
     */
    public function onFailure($callback)
    {
        $this->failureCallbacks[] = $callback instanceof Closure
                        ? new SerializableClosure($callback)
                        : $callback;

        return $this;
    }

    /**
     * Handle a job failure.
     *
     * @param  \Throwable  $e
     * @return void
     */
    public function failed($e)
    {
        foreach ($this->failureCallbacks as $callback) {
            $callback($e);
        }
    }

    /**
     * Get the display name for the queued job.
     *
     * @return string
     */
    public function displayName()
    {
        $reflection = new ReflectionFunction($this->closure->getClosure());

        return 'Closure ('.basename($reflection->getFileName()).':'.$reflection->getStartLine().')';
    }
}