ListenerMakeCommand.php
TLDR
This file contains the ListenerMakeCommand
class, which is responsible for creating a new event listener class in the Illuminate framework. It extends the GeneratorCommand
class and uses the CreatesMatchingTest
trait.
Methods
There are several methods defined in the ListenerMakeCommand
class:
buildClass($name)
This method builds the class with the given name. It uses the event
option to determine the event class to listen for and replaces placeholders in the stub file with the actual class name.
getStub()
This method returns the stub file for the generator based on the queued
and event
options. Depending on these options, it returns different stub files.
alreadyExists($rawName)
This method determines if the class already exists by checking if the class with the given name exists.
getDefaultNamespace($rootNamespace)
This method returns the default namespace for the class, which is the root namespace appended with "\Listeners".
getOptions()
This method returns an array of console command options. It includes options for the event class, force creation, and queueing.
afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
This method interacts further with the user if they were prompted for missing arguments. It suggests possible events and sets the event
option if the user chooses an event.
Class
ListenerMakeCommand
This class is responsible for creating a new event listener class. It extends the GeneratorCommand
class and uses the CreatesMatchingTest
trait. It has properties for the command name, description, and type of the class being generated. It also includes methods for building the class, getting the stub file, determining if the class already exists, getting the default namespace, getting the console command options, and interacting with the user for missing arguments.
<?php
namespace Illuminate\Foundation\Console;
use Illuminate\Console\Concerns\CreatesMatchingTest;
use Illuminate\Console\GeneratorCommand;
use Illuminate\Support\Str;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use function Laravel\Prompts\suggest;
#[AsCommand(name: 'make:listener')]
class ListenerMakeCommand extends GeneratorCommand
{
use CreatesMatchingTest;
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:listener';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new event listener class';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Listener';
/**
* Build the class with the given name.
*
* @param string $name
* @return string
*/
protected function buildClass($name)
{
$event = $this->option('event') ?? '';
if (! Str::startsWith($event, [
$this->laravel->getNamespace(),
'Illuminate',
'\\',
])) {
$event = $this->laravel->getNamespace().'Events\\'.str_replace('/', '\\', $event);
}
$stub = str_replace(
['DummyEvent', '{{ event }}'], class_basename($event), parent::buildClass($name)
);
return str_replace(
['DummyFullEvent', '{{ eventNamespace }}'], trim($event, '\\'), $stub
);
}
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
if ($this->option('queued')) {
return $this->option('event')
? __DIR__.'/stubs/listener-queued.stub'
: __DIR__.'/stubs/listener-queued-duck.stub';
}
return $this->option('event')
? __DIR__.'/stubs/listener.stub'
: __DIR__.'/stubs/listener-duck.stub';
}
/**
* Determine if the class already exists.
*
* @param string $rawName
* @return bool
*/
protected function alreadyExists($rawName)
{
return class_exists($rawName);
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Listeners';
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return [
['event', 'e', InputOption::VALUE_OPTIONAL, 'The event class being listened for'],
['force', 'f', InputOption::VALUE_NONE, 'Create the class even if the listener already exists'],
['queued', null, InputOption::VALUE_NONE, 'Indicates the event listener should be queued'],
];
}
/**
* Interact further with the user if they were prompted for missing arguments.
*
* @param \Symfony\Component\Console\Input\InputInterface $input
* @param \Symfony\Component\Console\Output\OutputInterface $output
* @return void
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
{
if ($this->isReservedName($this->getNameInput()) || $this->didReceiveOptions($input)) {
return;
}
$event = suggest(
'What event should be listened for? (Optional)',
$this->possibleEvents(),
);
if ($event) {
$input->setOption('event', $event);
}
}
}