Commit 6dc6b0b2 authored by 王源's avatar 王源 🎧

添加repository生成器命令行

parent 66b698fb
...@@ -12,7 +12,8 @@ ...@@ -12,7 +12,8 @@
"require": { "require": {
"ext-json": "*", "ext-json": "*",
"hyperf/db-connection": "^1.1@dev", "hyperf/db-connection": "^1.1@dev",
"hyperf/validation": "^1.1@dev" "hyperf/validation": "^1.1@dev",
"hyperf/command": "^1.1@dev"
}, },
"minimum-stability": "dev", "minimum-stability": "dev",
"autoload": { "autoload": {
...@@ -22,5 +23,10 @@ ...@@ -22,5 +23,10 @@
"files": [ "files": [
"src/functions.php" "src/functions.php"
] ]
},
"extra": {
"hyperf": {
"config": "Meibuyu\\Micro\\ConfigProvider"
}
} }
} }
<?php
/**
* Created by PhpStorm.
* User: zero
* Date: 2020/2/11
* Time: 11:59
*/
namespace Meibuyu\Micro\Command;
use Hyperf\Command\Annotation\Command;
use Hyperf\Command\Command as HyperfCommand;
use Meibuyu\Micro\Generator\FileAlreadyExistsException;
use Meibuyu\Micro\Generator\RepositoryEloquentGenerator;
use Symfony\Component\Console\Input\InputArgument;
/**
* @Command()
*/
class RepositoryCommand extends HyperfCommand
{
protected $name = 'gen:repository';
/**
* Handle the current command.
*/
public function handle()
{
try {
$name = $this->input->getArgument('name');
$createValidator = $this->output->confirm('同时创建验证器?', true);
(new RepositoryEloquentGenerator([
'name' => $name,
'validator' => $createValidator,
]))->run();
$this->info("Repository created successfully.");
} catch (FileAlreadyExistsException $e) {
$this->error($e->getMessage() . ' already exists!');
}
}
public function getArguments()
{
return [['name', InputArgument::REQUIRED, '名称']];
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: wangy
* Date: 2020/2/12
* Time: 10:49
*/
namespace Meibuyu\Micro\Command;
use Hyperf\Command\Annotation\Command;
use Hyperf\Command\Command as HyperfCommand;
use Meibuyu\Micro\Generator\FileAlreadyExistsException;
use Meibuyu\Micro\Generator\ValidatorGenerator;
use Symfony\Component\Console\Input\InputArgument;
/**
* @Command()
*/
class ValidatorCommand extends HyperfCommand
{
protected $name = 'gen:validator';
/**
* Handle the current command.
*/
public function handle()
{
try {
$name = $this->input->getArgument('name');
(new ValidatorGenerator(['name' => $name]))->run();
$this->info("Validator created successfully.");
} catch (FileAlreadyExistsException $e) {
$this->error($e->getMessage() . ' already exists!');
}
}
public function getArguments()
{
return [['name', InputArgument::REQUIRED, '名称']];
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: zero
* Date: 2020/2/11
* Time: 11:49
*/
namespace Meibuyu\Micro;
class ConfigProvider
{
public function __invoke(): array
{
return [
'commands' => [
\Meibuyu\Micro\Command\RepositoryCommand::class,
\Meibuyu\Micro\Command\ValidatorCommand::class,
],
];
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: zero
* Date: 2020/2/11
* Time: 15:23
*/
namespace Meibuyu\Micro\Generator;
class FileAlreadyExistsException extends \Exception
{
}
\ No newline at end of file
<?php
declare(strict_types=1);
/**
* Created by PhpStorm.
* User: zero
* Date: 2020/2/11
* Time: 15:16
*/
namespace Meibuyu\Micro\Generator;
use Hyperf\Utils\CodeGen\Project;
use Hyperf\Utils\Filesystem\Filesystem;
use Hyperf\Utils\Str;
use Meibuyu\Micro\Generator\Stubs\Stub;
abstract class Generator
{
/**
* The filesystem instance.
*
* @var Filesystem
*/
protected $filesystem;
/**
* The array of options.
*
* @var array
*/
protected $options;
/**
* The shortname of stub.
*
* @var string
*/
protected $stub;
/**
* The class-specific output paths.
*
* @var string
*/
protected $classPath = '';
/**
* The file extension.
* @var string
*/
protected $extension = '';
protected $_name;
protected $_namespace;
/**
* Create new instance of this class.
*
* @param array $options
*/
public function __construct(array $options = [])
{
$this->filesystem = new Filesystem;
$this->options = $options;
$this->makeName();
$this->makeNamespace();
}
/**
* Make name.
*/
public function makeName()
{
$name = $this->name;
if (Str::contains($this->name, '\\')) {
$name = str_replace('\\', '/', $this->name);
}
if (Str::contains($this->name, '/')) {
$name = str_replace('/', '/', $this->name);
}
$this->_name = Str::studly(str_replace(' ', '/', ucwords(str_replace('/', ' ', $name))));
}
/**
* Make namespace
*/
public function makeNamespace()
{
$classNamespace = str_replace('/', '\\', $this->classPath);
$this->_namespace = 'App\\' . $classNamespace . '\\';
}
/**
* Get extension.
*
* @return string
*/
public function getExtension()
{
return $this->extension;
}
/**
* Run the generator.
*
* @return int
* @throws FileAlreadyExistsException
*/
public function run()
{
$path = $this->getPath();
if ($this->filesystem->exists($path)) {
throw new FileAlreadyExistsException($path);
}
if (!$this->filesystem->isDirectory($dir = dirname($path))) {
$this->filesystem->makeDirectory($dir, 0777, true, true);
}
return $this->filesystem->put($path, $this->getStub());
}
/**
* Get destination path for generated file.
*
* @return string
*/
public function getPath()
{
$project = new Project();
return BASE_PATH . '/' . $project->path($this->_namespace . $this->_name . $this->extension);
}
/**
* Get stub template for generated file.
*
* @return string
*/
public function getStub()
{
return (new Stub(__DIR__ . '/Stubs/' . $this->stub . '.stub', $this->getReplacements()))->render();
}
/**
* Get template replacements.
*
* @return array
*/
public function getReplacements()
{
return [
'date' => $this->getDate(),
'time' => $this->getTime(),
'class' => $this->getClass(),
'namespace' => $this->getNamespace(),
];
}
public function getDate()
{
return date('Y/m/d', time());
}
public function getTime()
{
return date('h:i', time());
}
/**
* Get class name.
*
* @return string
*/
public function getClass()
{
return Str::studly(class_basename($this->_name));
}
/**
* Get class namespace.
*
* @return string
*/
public function getNamespace()
{
$segments = explode('/', $this->_name);
array_pop($segments);
return 'namespace ' . rtrim($this->_namespace . implode($segments, '\\'), '\\') . ';';
}
/**
* Get value from options by given key.
*
* @param string $key
* @param string|null $default
*
* @return string
*/
public function getOption($key, $default = null)
{
if (!array_key_exists($key, $this->options)) {
return $default;
}
return $this->options[$key] ?: $default;
}
/**
* Helper method for "getOption".
*
* @param string $key
* @param string|null $default
*
* @return string
*/
public function option($key, $default = null)
{
return $this->getOption($key, $default);
}
/**
* Handle call to __get method.
*
* @param string $key
*
* @return string|mixed
*/
public function __get($key)
{
if (property_exists($this, $key)) {
return $this->{$key};
}
return $this->option($key);
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: wangy
* Date: 2020/2/12
* Time: 9:15
*/
namespace Meibuyu\Micro\Generator;
class RepositoryEloquentGenerator extends Generator
{
protected $stub = 'repository/eloquent';
protected $classPath = 'Repository/Eloquent';
protected $extension = 'RepositoryEloquent';
/**
* @return array
* @throws FileAlreadyExistsException
*/
public function getReplacements()
{
return array_merge(parent::getReplacements(), [
'interface' => $this->getInterface(),
'validator' => $this->getValidator(),
'validator_method' => $this->getValidatorMethod(),
]);
}
/**
* @return string
* @throws FileAlreadyExistsException
*/
public function getInterface()
{
$interfaceGenerator = new RepositoryInterfaceGenerator(['name' => $this->name]);
$interfaceNamespace = $interfaceGenerator->_namespace . $interfaceGenerator->_name;
$interfaceGenerator->run();
return str_replace(["\\", '/'], '\\', $interfaceNamespace) . $interfaceGenerator->getExtension();
}
/**
* @return string
* @throws FileAlreadyExistsException
*/
public function getValidator()
{
if ($this->validator) {
$validatorGenerator = new ValidatorGenerator(['name' => $this->name]);
$validatorNamespace = $validatorGenerator->_namespace . $validatorGenerator->_name;
$validatorGenerator->run();
return 'use ' . str_replace(["\\", '/'], '\\', $validatorNamespace) . $validatorGenerator->getExtension() . ';';
} else {
return '';
}
}
public function getValidatorMethod()
{
if ($this->validator) {
$class = $this->getClass();
return 'public function validator()' . PHP_EOL . ' {' . PHP_EOL . ' return ' . $class . 'Validator::class;' . PHP_EOL . ' }' . PHP_EOL;
} else {
return '';
}
}
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: zero
* Date: 2020/2/11
* Time: 15:15
*/
namespace Meibuyu\Micro\Generator;
class RepositoryInterfaceGenerator extends Generator
{
protected $stub = 'repository/interface';
protected $classPath = 'Repository/Interfaces';
protected $extension = 'Repository';
}
\ No newline at end of file
<?php
/**
* Created by PhpStorm.
* User: zero
* Date: 2020/2/11
* Time: 16:39
*/
namespace Meibuyu\Micro\Generator\Stubs;
class Stub
{
/**
* The base path of stub file.
*
* @var null|string
*/
protected static $basePath = null;
/**
* The stub path.
*
* @var string
*/
protected $path;
/**
* The replacements array.
*
* @var array
*/
protected $replaces = [];
/**
* The contructor.
*
* @param string $path
* @param array $replaces
*/
public function __construct($path, array $replaces = [])
{
$this->path = $path;
$this->replaces = $replaces;
}
/**
* Create new self instance.
*
* @param string $path
* @param array $replaces
*
* @return self
*/
public static function create($path, array $replaces = [])
{
return new static($path, $replaces);
}
/**
* Set base path.
*
* @param string $path
*
* @return void
*/
public static function setBasePath($path)
{
static::$basePath = $path;
}
/**
* Set replacements array.
*
* @param array $replaces
*
* @return $this
*/
public function replace(array $replaces = [])
{
$this->replaces = $replaces;
return $this;
}
/**
* Get replacements.
*
* @return array
*/
public function getReplaces()
{
return $this->replaces;
}
/**
* Handle magic method __toString.
*
* @return string
*/
public function __toString()
{
return $this->render();
}
/**
* Get stub contents.
*
* @return string
*/
public function render()
{
return $this->getContents();
}
/**
* Get stub contents.
*
* @return mixed|string
*/
public function getContents()
{
$contents = file_get_contents($this->getPath());
foreach ($this->replaces as $search => $replace) {
$contents = str_replace('$' . strtoupper($search) . '$', $replace, $contents);
}
return $contents;
}
/**
* Get stub path.
*
* @return string
*/
public function getPath()
{
return static::$basePath . $this->path;
}
/**
* Set stub path.
*
* @param string $path
*
* @return self
*/
public function setPath($path)
{
$this->path = $path;
return $this;
}
}
\ No newline at end of file
<?php
declare(strict_types=1);
/**
* Auto generated file.
* Date: $DATE$
* Time: $TIME$
*/
$NAMESPACE$
use Meibuyu\Micro\Repository\Eloquent\BaseRepository;
use $INTERFACE$;
$VALIDATOR$
/**
* Class $CLASS$RepositoryEloquent.
*
* @package $NAMESPACE$
*/
class $CLASS$RepositoryEloquent extends BaseRepository implements $CLASS$Repository
{
public function model()
{
//
}
$VALIDATOR_METHOD$
}
<?php
declare(strict_types=1);
/**
* Auto generated file.
* Date: $DATE$
* Time: $TIME$
*/
$NAMESPACE$
use Meibuyu\Micro\Repository\Contracts\RepositoryInterface;
/**
* Interface $CLASS$Repository.
*
* @package $NAMESPACE$
*/
interface $CLASS$Repository extends RepositoryInterface
{
//
}
<?php
declare(strict_types=1);
/**
* Auto generated file.
* Date: $DATE$
* Time: $TIME$
*/
$NAMESPACE$
use Meibuyu\Micro\Validator\Contracts\ValidatorInterface;
use Meibuyu\Micro\Validator\HyperfValidator;
class $CLASS$Validator extends HyperfValidator
{
protected $rules = [
ValidatorInterface::RULE_CREATE => [],
ValidatorInterface::RULE_UPDATE => [],
];
}
<?php
/**
* Created by PhpStorm.
* User: wangy
* Date: 2020/2/12
* Time: 10:05
*/
namespace Meibuyu\Micro\Generator;
class ValidatorGenerator extends Generator
{
protected $stub = 'validator/validator';
protected $classPath = 'Validators';
protected $extension = 'Validator';
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment