创建Service命令

使用以下命令生成命令行文件

1
php artisan make:command MakeService

命令文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php namespace Ake\Tools\Commands;

use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputOption;

class MakeService extends GeneratorCommand
{

/**
* The console command name.
* 控制台命令名。
* @var string
*/
protected $name = 'make:service';

/**
* The console command description.
* console命令说明。
* @var string
*/
protected $description = '生成service对象类';

/**
* The type of class being generated.
* 生成的类的类型。
* @var string
*/
protected $type = 'Service';

public function buildClass($name)
{
$stub = parent::buildClass($name);

if ($this->option('base')) return $stub;

$model = $this->option('model');

return $model ? $this->replaceModel($stub, $name) : $stub;
}

/**
* @description:Get the stub file for the generator.
* @description:获取生成器的存根文件。
* @return string
* @Author:AKE
* @Date:2022/5/24 10:50
*/
protected function getStub()
{
if ($this->option('base')) return $this->path('/stubs/service.base.stub');
return $this->option('model') ?
$this->path('/stubs/service.plain.stub') :
$this->path('/stubs/service.stub');
}

/**
* @description:Get the default namespace for the class.
* @description:获取默认命名空间
* @param string $rootNamespace
* @return string
* @Author:AKE
* @Date:2022/5/24 10:50
*/
protected function getDefaultNamespace($rootNamespace)
{
return $rootNamespace . '\Services';
}

/**
* @description:替换给定存根的模型
* @param $stub
* @param $model
* @return array|string|string[]
* @Author:AKE
* @Date:2022/5/24 11:50
*/
private function replaceModel($stub, $model)
{
$modelClass = $this->buildModel($model);

$replace = [
'DummyFullModelClass' => $modelClass,
'{{namespacedModel}}' => $modelClass,
'{{ namespacedModel }}' => $modelClass,
];

return str_replace(
array_keys($replace), array_values($replace), $stub
);
}

/**
* @description:构建model名
* @param $model
* @return string
* @Author:AKE
* @Date:2022/5/24 11:47
*/
private function buildModel($model)
{
if (preg_match('([^A-Za-z0-9_/\\\\])', $model)) {
throw new \InvalidArgumentException('模型名称包含无效字符。');
}
return $this->qualifyModel($model);
}

/**
* @description:添加参数
* @return array[]
* @Author:AKE
* @Date:2022/5/24 13:04
*/
protected function getOptions()
{
#第一个参数,为变量名,即 --model 调用或者 --model= 调用
#第二个参数,为别名,即简写 -m 调用
#第三个参数,Symfony\Component\Console\Input\InputOption 中的常量 VALUE_NONE (bool)
#第四个参数,为描述
#第五个参数,为默认值 InputOption::VALUE_NONE 时必须为 null
return [
['model', 'm', InputOption::VALUE_NONE, '是否关联 model '],
['base', 'b', InputOption::VALUE_NONE, '创建基类 service '],
];
}

private function path($path)
{
return __DIR__ . $path;
}
}

存根/模板文件默认放在根目录的 stubs下面

默认生成文件

文件名 service.stub

1
2
3
4
5
6
7
8
<?php namespace {{ namespace }};

use App\Services\Service;

class {{ class }} extends Service
{

}

生成附带 use model 的文件

文件名 service.plain.stub

1
2
3
4
5
6
7
8
9
<?php namespace {{ namespace }};

use App\Services\Service;
use {{ namespacedModel }} as Model;

class {{ class }} extends Service
{
protected $modelClass = '{{ namespacedModel }}';
}

生成基类 service 文件

文件名 service.base.stub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php namespace App\Services;

use Illuminate\Database\Eloquent\Builder;

class Service
{
#模型
protected $modelClass;

/**
* @description:模型类对象
* @return Builder
* @Author:AKE
* @Date:2022/7/7 14:34
*/
public function model()
{
return (new $this->modelClass)->newQuery();
}

#详情
public function detail(int $id)
{
return $this->model->find($id)->toArray();
}

#seo 获取
public function seo(int $id)
{
return $this->model->select(['seo_title', 'seo_keyword', 'seo_description'])->find($id)->toArray();
}
}

#使用命令

1
2
3
4
// 不添加 model 参数
php artisan make:service IndexService
// 生成use model 的文件
php artisan make:service IndexService -m