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().')';
}
}