ListFailedCommand.php
TLDR
This file contains the ListFailedCommand
class which is used to display a list of all failed queue jobs. It includes methods to handle the command execution, retrieve and parse the failed jobs, extract the job name from the payload, and display the failed jobs in the console.
Methods
handle
Executes the console command. Retrieves the list of failed jobs and displays them in the console.
getFailedJobs
Compiles the failed jobs into a displayable format.
parseFailedJob
Parses a failed job row by removing unnecessary data and adding the job name.
extractJobName
Extracts the failed job name from the payload.
matchJobName
Matches the job name from the payload by using regular expressions.
displayFailedJobs
Displays the failed jobs in the console.
Note: The ListFailedCommand
class extends the Command
class from the Illuminate\Console
namespace.
<?php
namespace Illuminate\Queue\Console;
use Illuminate\Console\Command;
use Illuminate\Support\Arr;
use Symfony\Component\Console\Attribute\AsCommand;
#[AsCommand(name: 'queue:failed')]
class ListFailedCommand extends Command
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'queue:failed';
/**
* The console command description.
*
* @var string
*/
protected $description = 'List all of the failed queue jobs';
/**
* The table headers for the command.
*
* @var string[]
*/
protected $headers = ['ID', 'Connection', 'Queue', 'Class', 'Failed At'];
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
if (count($jobs = $this->getFailedJobs()) === 0) {
return $this->components->info('No failed jobs found.');
}
$this->newLine();
$this->displayFailedJobs($jobs);
$this->newLine();
}
/**
* Compile the failed jobs into a displayable format.
*
* @return array
*/
protected function getFailedJobs()
{
$failed = $this->laravel['queue.failer']->all();
return collect($failed)->map(function ($failed) {
return $this->parseFailedJob((array) $failed);
})->filter()->all();
}
/**
* Parse the failed job row.
*
* @param array $failed
* @return array
*/
protected function parseFailedJob(array $failed)
{
$row = array_values(Arr::except($failed, ['payload', 'exception']));
array_splice($row, 3, 0, $this->extractJobName($failed['payload']) ?: '');
return $row;
}
/**
* Extract the failed job name from payload.
*
* @param string $payload
* @return string|null
*/
private function extractJobName($payload)
{
$payload = json_decode($payload, true);
if ($payload && (! isset($payload['data']['command']))) {
return $payload['job'] ?? null;
} elseif ($payload && isset($payload['data']['command'])) {
return $this->matchJobName($payload);
}
}
/**
* Match the job name from the payload.
*
* @param array $payload
* @return string|null
*/
protected function matchJobName($payload)
{
preg_match('/"([^"]+)"/', $payload['data']['command'], $matches);
return $matches[1] ?? $payload['job'] ?? null;
}
/**
* Display the failed jobs in the console.
*
* @param array $jobs
* @return void
*/
protected function displayFailedJobs(array $jobs)
{
collect($jobs)->each(
fn ($job) => $this->components->twoColumnDetail(
sprintf('<fg=gray>%s</> %s</>', $job[4], $job[0]),
sprintf('<fg=gray>%s@%s</> %s', $job[1], $job[2], $job[3])
),
);
}
}