ObserverMakeCommand.php
TLDR
The ObserverMakeCommand.php
file in the Illuminate\Foundation\Console
namespace contains the ObserverMakeCommand
class. This class is responsible for generating a new observer class using the "make:observer" console command. The observer class can be created with or without a model association.
Methods
buildClass($name)
This method builds the observer class with the given name. It calls the parent's buildClass
method to generate the initial stub and then replaces the model placeholder in the stub if the model
option is provided.
replaceModel($stub, $model)
This method replaces placeholders in the stub with the provided model class and variable names.
parseModel($model)
This method validates the provided model name and returns the fully-qualified model class name.
getStub()
This method returns the stub file path based on the presence of the model
option.
resolveStubPath($stub)
This method resolves the fully-qualified path to the stub file.
getDefaultNamespace($rootNamespace)
This method returns the default namespace for the generated observer class.
getOptions()
This method returns the console command options including "force" and "model".
afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
This method interacts further with the user if they were prompted for missing arguments. It suggests possible models to which the observer can be applied and sets the "model" option if a model is selected.
Classes
No classes in the file
<?php
namespace Illuminate\Foundation\Console;
use Illuminate\Console\GeneratorCommand;
use InvalidArgumentException;
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:observer')]
class ObserverMakeCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:observer';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new observer class';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Observer';
/**
* Build the class with the given name.
*
* @param string $name
* @return string
*/
protected function buildClass($name)
{
$stub = parent::buildClass($name);
$model = $this->option('model');
return $model ? $this->replaceModel($stub, $model) : $stub;
}
/**
* Replace the model for the given stub.
*
* @param string $stub
* @param string $model
* @return string
*/
protected function replaceModel($stub, $model)
{
$modelClass = $this->parseModel($model);
$replace = [
'DummyFullModelClass' => $modelClass,
'{{ namespacedModel }}' => $modelClass,
'{{namespacedModel}}' => $modelClass,
'DummyModelClass' => class_basename($modelClass),
'{{ model }}' => class_basename($modelClass),
'{{model}}' => class_basename($modelClass),
'DummyModelVariable' => lcfirst(class_basename($modelClass)),
'{{ modelVariable }}' => lcfirst(class_basename($modelClass)),
'{{modelVariable}}' => lcfirst(class_basename($modelClass)),
];
return str_replace(
array_keys($replace), array_values($replace), $stub
);
}
/**
* Get the fully-qualified model class name.
*
* @param string $model
* @return string
*
* @throws \InvalidArgumentException
*/
protected function parseModel($model)
{
if (preg_match('([^A-Za-z0-9_/\\\\])', $model)) {
throw new InvalidArgumentException('Model name contains invalid characters.');
}
return $this->qualifyModel($model);
}
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return $this->option('model')
? $this->resolveStubPath('/stubs/observer.stub')
: $this->resolveStubPath('/stubs/observer.plain.stub');
}
/**
* Resolve the fully-qualified path to the stub.
*
* @param string $stub
* @return string
*/
protected function resolveStubPath($stub)
{
return file_exists($customPath = $this->laravel->basePath(trim($stub, '/')))
? $customPath
: __DIR__.$stub;
}
/**
* Get the default namespace for the class.
*
* @param string $rootNamespace
* @return string
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace.'\Observers';
}
/**
* Get the console command arguments.
*
* @return array
*/
protected function getOptions()
{
return [
['force', 'f', InputOption::VALUE_NONE, 'Create the class even if the observer already exists'],
['model', 'm', InputOption::VALUE_OPTIONAL, 'The model that the observer applies to'],
];
}
/**
* 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;
}
$model = suggest(
'What model should this observer apply to? (Optional)',
$this->possibleModels(),
);
if ($model) {
$input->setOption('model', $model);
}
}
}