You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.0 KiB
128 lines
3.0 KiB
4 years ago
|
<?php
|
||
|
|
||
|
namespace App\Console\Commands;
|
||
|
|
||
|
use Illuminate\Console\GeneratorCommand;
|
||
|
use Illuminate\Support\Facades\DB;
|
||
|
use Illuminate\Support\Str;
|
||
|
use Symfony\Component\Console\Input\InputOption;
|
||
|
|
||
|
class ApiResourceGenerator extends GeneratorCommand
|
||
|
{
|
||
|
/**
|
||
|
* The console command name.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $name = 'make:apiResource';
|
||
|
|
||
|
/**
|
||
|
* The console command description.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $description = 'Create a new resource';
|
||
|
|
||
|
/**
|
||
|
* The type of class being generated.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $type = 'Resource';
|
||
|
|
||
|
/**
|
||
|
* Execute the console command.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function handle()
|
||
|
{
|
||
|
if ($this->collection()) {
|
||
|
$this->type = 'Resource collection';
|
||
|
}
|
||
|
|
||
|
parent::handle();
|
||
|
}
|
||
|
|
||
|
protected function buildClass($name)
|
||
|
{
|
||
|
$db_name = DB::connection()->getDatabaseName();
|
||
|
$table_name = env('DB_PREFIX') . Str::snake(str_replace($this->getNamespace($name).'\\', '', $name) . 'T');
|
||
|
|
||
|
$properties = '';
|
||
|
$columns = DB::select("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{$db_name}' AND TABLE_NAME = '{$table_name}'");
|
||
|
foreach ($columns as $column){
|
||
|
$properties .= ' \''. $column->COLUMN_NAME . '\' => $this->' . $column->COLUMN_NAME . ',' . PHP_EOL;
|
||
|
}
|
||
|
|
||
|
$replace = [
|
||
|
'{{ propertiesList }}' => Str::replaceLast(PHP_EOL, '', $properties),
|
||
|
];
|
||
|
|
||
|
return str_replace(
|
||
|
array_keys($replace), array_values($replace), parent::buildClass($name)
|
||
|
);
|
||
|
|
||
|
return str_replace(
|
||
|
array_keys($replace), array_values($replace), parent::buildClass($name)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the stub file for the generator.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function getStub()
|
||
|
{
|
||
|
return $this->resolveStubPath('/stubs/resource.stub');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determine if the command is generating a resource collection.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
protected function collection()
|
||
|
{
|
||
|
return $this->option('collection') ||
|
||
|
Str::endsWith($this->argument('name'), 'Collection');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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.'\Http\Resources';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the console command options.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function getOptions()
|
||
|
{
|
||
|
return [
|
||
|
['collection', 'c', InputOption::VALUE_NONE, 'Create a resource collection'],
|
||
|
];
|
||
|
}
|
||
|
}
|