197 lines
4.1 KiB
PHP
197 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace Illuminate\Bus;
|
|
|
|
use Closure;
|
|
use Illuminate\Queue\CallQueuedClosure;
|
|
use Illuminate\Support\Arr;
|
|
use RuntimeException;
|
|
|
|
trait Queueable
|
|
{
|
|
/**
|
|
* The name of the connection the job should be sent to.
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $connection;
|
|
|
|
/**
|
|
* The name of the queue the job should be sent to.
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $queue;
|
|
|
|
/**
|
|
* The name of the connection the chain should be sent to.
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $chainConnection;
|
|
|
|
/**
|
|
* The name of the queue the chain should be sent to.
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $chainQueue;
|
|
|
|
/**
|
|
* The number of seconds before the job should be made available.
|
|
*
|
|
* @var \DateTimeInterface|\DateInterval|int|null
|
|
*/
|
|
public $delay;
|
|
|
|
/**
|
|
* The middleware the job should be dispatched through.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $middleware = [];
|
|
|
|
/**
|
|
* The jobs that should run if this job is successful.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $chained = [];
|
|
|
|
/**
|
|
* Set the desired connection for the job.
|
|
*
|
|
* @param string|null $connection
|
|
* @return $this
|
|
*/
|
|
public function onConnection($connection)
|
|
{
|
|
$this->connection = $connection;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the desired queue for the job.
|
|
*
|
|
* @param string|null $queue
|
|
* @return $this
|
|
*/
|
|
public function onQueue($queue)
|
|
{
|
|
$this->queue = $queue;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the desired connection for the chain.
|
|
*
|
|
* @param string|null $connection
|
|
* @return $this
|
|
*/
|
|
public function allOnConnection($connection)
|
|
{
|
|
$this->chainConnection = $connection;
|
|
$this->connection = $connection;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the desired queue for the chain.
|
|
*
|
|
* @param string|null $queue
|
|
* @return $this
|
|
*/
|
|
public function allOnQueue($queue)
|
|
{
|
|
$this->chainQueue = $queue;
|
|
$this->queue = $queue;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the desired delay for the job.
|
|
*
|
|
* @param \DateTimeInterface|\DateInterval|int|null $delay
|
|
* @return $this
|
|
*/
|
|
public function delay($delay)
|
|
{
|
|
$this->delay = $delay;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Specify the middleware the job should be dispatched through.
|
|
*
|
|
* @param array|object $middleware
|
|
* @return $this
|
|
*/
|
|
public function through($middleware)
|
|
{
|
|
$this->middleware = Arr::wrap($middleware);
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the jobs that should run if this job is successful.
|
|
*
|
|
* @param array $chain
|
|
* @return $this
|
|
*/
|
|
public function chain($chain)
|
|
{
|
|
$this->chained = collect($chain)->map(function ($job) {
|
|
return $this->serializeJob($job);
|
|
})->all();
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Serialize a job for queuing.
|
|
*
|
|
* @param mixed $job
|
|
* @return string
|
|
*/
|
|
protected function serializeJob($job)
|
|
{
|
|
if ($job instanceof Closure) {
|
|
if (! class_exists(CallQueuedClosure::class)) {
|
|
throw new RuntimeException(
|
|
'To enable support for closure jobs, please install the illuminate/queue package.'
|
|
);
|
|
}
|
|
|
|
$job = CallQueuedClosure::create($job);
|
|
}
|
|
|
|
return serialize($job);
|
|
}
|
|
|
|
/**
|
|
* Dispatch the next job on the chain.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function dispatchNextJobInChain()
|
|
{
|
|
if (! empty($this->chained)) {
|
|
dispatch(tap(unserialize(array_shift($this->chained)), function ($next) {
|
|
$next->chained = $this->chained;
|
|
|
|
$next->onConnection($next->connection ?: $this->chainConnection);
|
|
$next->onQueue($next->queue ?: $this->chainQueue);
|
|
|
|
$next->chainConnection = $this->chainConnection;
|
|
$next->chainQueue = $this->chainQueue;
|
|
}));
|
|
}
|
|
}
|
|
}
|