src/Console/Commands/ControllerMakeCommand.php
<?php
declare(strict_types=1);
namespace Cortex\Foundation\Console\Commands;
use Illuminate\Support\Str;
use Illuminate\Console\ConfirmableTrait;
use Symfony\Component\Console\Attribute\AsCommand;
use Cortex\Foundation\Traits\ConsoleMakeModuleCommand;
use Illuminate\Routing\Console\ControllerMakeCommand as BaseControllerMakeCommand;
#[AsCommand(name: 'make:controller')]
class ControllerMakeCommand extends BaseControllerMakeCommand
{
use ConfirmableTrait;
use ConsoleMakeModuleCommand;
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub(): string
{
$stub = null;
if ($this->option('parent')) {
$stub = __DIR__.'/../../../resources/stubs/controller.nested.stub';
} elseif ($this->option('model')) {
$stub = __DIR__.'/../../../resources/stubs/controller.model.stub';
} elseif ($this->option('invokable')) {
$stub = __DIR__.'/../../../resources/stubs/controller.invokable.stub';
} elseif ($this->option('resource')) {
$stub = __DIR__.'/../../../resources/stubs/controller.stub';
}
if ($this->option('api') && is_null($stub)) {
$stub = __DIR__.'/../../../resources/stubs/controller.api.stub';
} elseif ($this->option('api') && ! is_null($stub) && ! $this->option('invokable')) {
$stub = str_replace('.stub', '.api.stub', $stub);
}
$stub = $stub ?? __DIR__.'/../../../resources/stubs/controller.plain.stub';
return $stub;
}
/**
* Build the replacements for a parent controller.
*
* @return array
*/
protected function buildParentReplacements()
{
$parentModelClass = $this->parseModel($this->option('parent'));
if (! class_exists($parentModelClass)) {
if ($this->confirm("A $parentModelClass model does not exist. Do you want to generate it?", true)) {
$this->call('make:model', ['name' => $parentModelClass, '--module' => $this->option('module')]);
}
}
return [
'ParentDummyFullModelClass' => $parentModelClass,
'{{ namespacedParentModel }}' => $parentModelClass,
'{{namespacedParentModel}}' => $parentModelClass,
'ParentDummyModelClass' => class_basename($parentModelClass),
'{{ parentModel }}' => class_basename($parentModelClass),
'{{parentModel}}' => class_basename($parentModelClass),
'ParentDummyModelVariable' => lcfirst(class_basename($parentModelClass)),
'{{ parentModelVariable }}' => lcfirst(class_basename($parentModelClass)),
'{{parentModelVariable}}' => lcfirst(class_basename($parentModelClass)),
];
}
/**
* Build the model replacement values.
*
* @param array $replace
*
* @return array
*/
protected function buildModelReplacements(array $replace)
{
$modelClass = $this->parseModel($this->option('model'));
if (! class_exists($modelClass)) {
if ($this->confirm("A $modelClass model does not exist. Do you want to generate it?", true)) {
$this->call('make:model', ['name' => $modelClass, '--module' => $this->option('module')]);
}
}
return array_merge($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)),
]);
}
/**
* Qualify the given model class base name.
*
* @param string $model
*
* @return string
*/
protected function qualifyModel(string $model)
{
$model = ltrim($model, '\\/');
$model = str_replace('/', '\\', $model);
$rootNamespace = $this->rootNamespace();
if (Str::startsWith($model, $rootNamespace)) {
return $model;
}
return $rootNamespace.'Models\\'.$model;
}
}