Skip to content

Commit

Permalink
Merge pull request #120 from flipboxstudio/add_make_observer_command
Browse files Browse the repository at this point in the history
Add make:observer command
  • Loading branch information
jorgemudry authored Mar 26, 2022
2 parents abfebdf + d53a645 commit ee8e6a4
Show file tree
Hide file tree
Showing 7 changed files with 244 additions and 8 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ make:middleware Create a new middleware class
make:migration Create a new migration file
make:model Create a new Eloquent model class
make:notification Create a new notification class
make:observer Create a new observer class
make:pipe Create a new pipe class
make:policy Create a new policy class
make:provider Create a new service provider class
Expand Down
23 changes: 16 additions & 7 deletions src/LumenGenerator/Console/GeneratorCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ protected function buildClass($name)
*/
protected function replaceNamespace(&$stub, $name)
{
$userModelNamespace = $this->userProviderModel() ?? $this->getModelNamespace() . 'User';
$userModelNamespace = $this->userProviderModel() ?? $this->qualifyModel('User');

$stub = str_replace(
['DummyNamespace', 'DummyRootNamespace', 'NamespacedDummyUserModel'],
Expand Down Expand Up @@ -274,16 +274,25 @@ protected function getArguments()
}

/**
* Get the model's namespace baed on the app/Models folder.
* Qualify the given model class base name.
*
* @param string $model
* @return string
*/
protected function getModelNamespace()
protected function qualifyModel(string $model)
{
$modelsNameSpace = is_dir($this->laravel->basePath('app/Models'))
? $this->rootNamespace() . 'Models\\'
: $this->rootNamespace();
$model = ltrim($model, '\\/');

return $modelsNameSpace;
$model = str_replace('/', '\\', $model);

$rootNamespace = $this->rootNamespace();

if (Str::startsWith($model, $rootNamespace)) {
return $model;
}

return is_dir($this->laravel->basePath('app/Models'))
? $rootNamespace.'Models\\'.$model
: $rootNamespace.$model;
}
}
147 changes: 147 additions & 0 deletions src/LumenGenerator/Console/ObserverMakeCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
<?php

namespace Flipbox\LumenGenerator\Console;

use InvalidArgumentException;
use Symfony\Component\Console\Input\InputOption;

class ObserverMakeCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:observer';

/**
* The name of the console command.
*
* This name is used to identify the command during lazy loading.
*
* @var string|null
*/
protected static $defaultName = '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 [
['model', 'm', InputOption::VALUE_OPTIONAL, 'The model that the observer applies to.'],
];
}
}
2 changes: 1 addition & 1 deletion src/LumenGenerator/Console/PolicyMakeCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ protected function replaceModel($stub, $model)
if (Str::startsWith($model, '\\')) {
$stub = str_replace('NamespacedDummyModel', trim($model, '\\'), $stub);
} else {
$stub = str_replace('NamespacedDummyModel', $this->getModelNamespace() . $model, $stub);
$stub = str_replace('NamespacedDummyModel', $this->qualifyModel($model), $stub);
}

$model = class_basename(trim($model, '\\'));
Expand Down
8 changes: 8 additions & 0 deletions src/LumenGenerator/Console/stubs/observer.plain.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace DummyNamespace;

class DummyClass
{
//
}
63 changes: 63 additions & 0 deletions src/LumenGenerator/Console/stubs/observer.stub
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php

namespace DummyNamespace;

use {{ namespacedModel }};

class DummyClass
{
/**
* Handle the {{ model }} "created" event.
*
* @param \{{ namespacedModel }} ${{ modelVariable }}
* @return void
*/
public function created({{ model }} ${{ modelVariable }})
{
//
}

/**
* Handle the {{ model }} "updated" event.
*
* @param \{{ namespacedModel }} ${{ modelVariable }}
* @return void
*/
public function updated({{ model }} ${{ modelVariable }})
{
//
}

/**
* Handle the {{ model }} "deleted" event.
*
* @param \{{ namespacedModel }} ${{ modelVariable }}
* @return void
*/
public function deleted({{ model }} ${{ modelVariable }})
{
//
}

/**
* Handle the {{ model }} "restored" event.
*
* @param \{{ namespacedModel }} ${{ modelVariable }}
* @return void
*/
public function restored({{ model }} ${{ modelVariable }})
{
//
}

/**
* Handle the {{ model }} "force deleted" event.
*
* @param \{{ namespacedModel }} ${{ modelVariable }}
* @return void
*/
public function forceDeleted({{ model }} ${{ modelVariable }})
{
//
}
}
8 changes: 8 additions & 0 deletions src/LumenGenerator/LumenGeneratorServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class LumenGeneratorServiceProvider extends ServiceProvider
'SchemaDump' => 'command.schema.dump',
'CastMake' => 'command.cast.make',
'RuleMake' => 'command.rule.make',
'ObserverMake' => 'command.observer.make',
];

/**
Expand Down Expand Up @@ -371,6 +372,13 @@ protected function registerRuleMakeCommand()
});
}

protected function registerObserverMakeCommand()
{
$this->app->singleton('command.observer.make', function ($app) {
return new Console\ObserverMakeCommand($app['files']);
});
}

/**
* Get the services provided by the provider.
*
Expand Down

0 comments on commit ee8e6a4

Please sign in to comment.