1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Recca0120\Generator; |
4
|
|
|
|
5
|
|
|
use Illuminate\Support\Arr; |
6
|
|
|
use Illuminate\Support\Str; |
7
|
|
|
use Illuminate\Filesystem\Filesystem; |
8
|
|
|
use Recca0120\Generator\Fixers\UseSortFixer; |
9
|
|
|
|
10
|
|
|
class Generator |
11
|
|
|
{ |
12
|
|
|
/** |
13
|
|
|
* $filesystem. |
14
|
|
|
* |
15
|
|
|
* @var \Illuminate\Filesystem\Filesystem |
16
|
|
|
*/ |
17
|
|
|
protected $filesystem; |
18
|
|
|
|
19
|
|
|
/** |
20
|
|
|
* $useSortFixer. |
21
|
|
|
* |
22
|
|
|
* @var \Recca0120\Generator\Fixers\UseSortFixer |
23
|
|
|
*/ |
24
|
|
|
protected $useSortFixer; |
25
|
|
|
|
26
|
|
|
/** |
27
|
|
|
* $attributes. |
28
|
|
|
* |
29
|
|
|
* @var array |
30
|
|
|
*/ |
31
|
|
|
protected $attributes = []; |
32
|
|
|
|
33
|
|
|
/** |
34
|
|
|
* __construct. |
35
|
|
|
* |
36
|
|
|
* @param \Illuminate\Filesystem\Filesystem $filesystem [description] |
37
|
|
|
* @param \Recca0120\Generator\Fixers\UseSortFixers $useSortFixer [description] |
38
|
|
|
*/ |
39
|
9 |
|
public function __construct(Filesystem $filesystem = null, UseSortFixer $useSortFixer = null) |
40
|
|
|
{ |
41
|
9 |
|
$this->filesystem = $filesystem ?: new Filesystem(); |
42
|
9 |
|
$this->useSortFixer = $useSortFixer ?: new UseSortFixer(); |
43
|
9 |
|
$this->useSortFixer->setSortType(UseSortFixer::SORT_TYPE_LENGTH); |
44
|
9 |
|
} |
45
|
|
|
|
46
|
|
|
/** |
47
|
|
|
* parseAttribute. |
48
|
|
|
* |
49
|
|
|
* @param string $value |
50
|
|
|
* @return array |
51
|
|
|
*/ |
52
|
9 |
|
protected function parseAttribute($value) |
53
|
|
|
{ |
54
|
9 |
|
$alias = array_map('trim', explode(' as ', $value)); |
55
|
9 |
|
$className = $alias[0]; |
56
|
|
|
|
57
|
9 |
|
$dummyClass = class_basename(isset($alias[1]) === true ? $alias[1] : $className); |
58
|
9 |
|
$dummyNamespace = $this->getNamespace($className); |
59
|
|
|
|
60
|
9 |
|
$dummyModelVariable = Str::camel(Str::singular( |
61
|
9 |
|
preg_replace('/(Controller|Repository)$/', '', $dummyClass) |
62
|
9 |
|
)); |
63
|
|
|
|
64
|
9 |
|
$dummyCollectionVariable = Str::plural($dummyModelVariable); |
65
|
9 |
|
$dummyCollectionVariable = $dummyCollectionVariable === $dummyModelVariable ? |
66
|
9 |
|
$dummyModelVariable.'Collection' : $dummyCollectionVariable; |
67
|
|
|
|
68
|
9 |
|
$dummyRepositoryVariable = $dummyCollectionVariable; |
69
|
|
|
|
70
|
9 |
|
$dummyView = Str::snake(Str::plural($dummyModelVariable)); |
71
|
9 |
|
$dummyRoute = Str::snake(Str::plural($dummyModelVariable)); |
72
|
|
|
|
73
|
9 |
|
return compact( |
74
|
9 |
|
'dummyNamespace', |
75
|
9 |
|
'dummyClass', |
76
|
9 |
|
'dummyRepositoryVariable', |
77
|
9 |
|
'dummyCollectionVariable', |
78
|
9 |
|
'dummyModelVariable', |
79
|
9 |
|
'dummyView', |
80
|
|
|
'dummyRoute' |
81
|
9 |
|
); |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
/** |
85
|
|
|
* setFullBaseClass. |
86
|
|
|
* |
87
|
|
|
* @param string $value |
88
|
|
|
* @return static |
89
|
|
|
*/ |
90
|
7 |
|
public function setFullBaseClass($value) |
91
|
|
|
{ |
92
|
7 |
|
$this->set('DummyFullBaseClass', $value); |
93
|
7 |
|
$attributes = $this->parseAttribute($value); |
94
|
7 |
|
extract($attributes); |
95
|
|
|
|
96
|
7 |
|
$this->set('DummyBaseClass', $dummyClass); |
97
|
7 |
|
if ($this->get('DummyNamespace') === $this->getNamespace($value)) { |
98
|
2 |
|
$this->remove('DummyFullBaseClass'); |
99
|
2 |
|
} |
100
|
|
|
|
101
|
7 |
|
return $this; |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
/** |
105
|
|
|
* setFullRepositoryInterface. |
106
|
|
|
* |
107
|
|
|
* @param string $value |
108
|
|
|
* @return static |
109
|
|
|
*/ |
110
|
3 |
View Code Duplication |
public function setFullRepositoryInterface($value) |
|
|
|
|
111
|
|
|
{ |
112
|
3 |
|
$this->set('DummyFullRepositoryInterface', $value); |
113
|
3 |
|
$attributes = $this->parseAttribute($value); |
114
|
3 |
|
extract($attributes); |
115
|
|
|
|
116
|
3 |
|
return $this->setDefault('DummyNamespace', $dummyNamespace) |
117
|
3 |
|
->setDefault('DummyClass', $dummyClass) |
118
|
3 |
|
->setDefault('DummyRepositoryInterface', $dummyClass); |
119
|
|
|
} |
120
|
|
|
|
121
|
|
|
/** |
122
|
|
|
* setFullRepositoryClass. |
123
|
|
|
* |
124
|
|
|
* @param string $value |
125
|
|
|
* @return static |
126
|
|
|
*/ |
127
|
3 |
|
public function setFullRepositoryClass($value) |
128
|
|
|
{ |
129
|
3 |
|
$this->set('DummyFullRepositoryClass', $value); |
130
|
3 |
|
$attributes = $this->parseAttribute($value); |
131
|
3 |
|
extract($attributes); |
132
|
|
|
|
133
|
3 |
|
return $this->setDefault('DummyNamespace', $dummyNamespace) |
134
|
3 |
|
->setDefault('DummyClass', $dummyClass) |
135
|
3 |
|
->setDefault('DummyFullRepositoryInterface', $dummyNamespace.'\Contracts\\'.$dummyClass) |
136
|
3 |
|
->set('DummyRepositoryClass', $dummyClass); |
137
|
|
|
} |
138
|
|
|
|
139
|
|
|
/** |
140
|
|
|
* setFullModelClass. |
141
|
|
|
* |
142
|
|
|
* @param string $value |
143
|
|
|
* @return static |
144
|
|
|
*/ |
145
|
4 |
|
public function setFullModelClass($value) |
146
|
|
|
{ |
147
|
4 |
|
$this->set('DummyFullModelClass', $value); |
148
|
4 |
|
$attributes = $this->parseAttribute($value); |
149
|
4 |
|
extract($attributes); |
150
|
|
|
|
151
|
4 |
|
return $this->setDefault('DummyNamespace', $dummyNamespace) |
152
|
4 |
|
->setDefault('DummyClass', $dummyClass) |
153
|
4 |
|
->setDefault('DummyModelVariable', $dummyModelVariable) |
154
|
4 |
|
->setDefault('DummyFullPresenterClass', $dummyNamespace.'\Presenters\\'.$dummyClass.'Presenter') |
155
|
4 |
|
->setDefault('DummyPresenterClass', $dummyClass.'Presenter') |
156
|
4 |
|
->set('DummyModelClass', $dummyClass); |
157
|
|
|
} |
158
|
|
|
|
159
|
|
|
/** |
160
|
|
|
* setFullPresenterClass. |
161
|
|
|
* |
162
|
|
|
* @param string $value |
163
|
|
|
* @return static |
164
|
|
|
*/ |
165
|
1 |
View Code Duplication |
public function setFullPresenterClass($value) |
|
|
|
|
166
|
|
|
{ |
167
|
1 |
|
$this->set('DummyFullPresenterClass', $value); |
168
|
1 |
|
$attributes = $this->parseAttribute($value); |
169
|
1 |
|
extract($attributes); |
170
|
|
|
|
171
|
1 |
|
return $this->setDefault('DummyNamespace', $dummyNamespace) |
172
|
1 |
|
->setDefault('DummyClass', $dummyClass) |
173
|
1 |
|
->set('DummyPresenterClass', $dummyClass); |
174
|
|
|
} |
175
|
|
|
|
176
|
|
|
/** |
177
|
|
|
* setFullRequestClass. |
178
|
|
|
* |
179
|
|
|
* @param string $value |
180
|
|
|
* @return static |
181
|
|
|
*/ |
182
|
3 |
View Code Duplication |
public function setFullRequestClass($value) |
|
|
|
|
183
|
|
|
{ |
184
|
3 |
|
$this->set('DummyFullRequestClass', $value); |
185
|
3 |
|
$attributes = $this->parseAttribute($value); |
186
|
3 |
|
extract($attributes); |
187
|
|
|
|
188
|
3 |
|
return $this->setDefault('DummyNamespace', $dummyNamespace) |
189
|
3 |
|
->setDefault('DummyClass', $dummyClass) |
190
|
3 |
|
->set('DummyRequestClass', $dummyClass); |
191
|
|
|
} |
192
|
|
|
|
193
|
|
|
/** |
194
|
|
|
* setFullControllerClass. |
195
|
|
|
* |
196
|
|
|
* @param string $value |
197
|
|
|
* @return static |
198
|
|
|
*/ |
199
|
2 |
|
public function setFullControllerClass($value) |
200
|
|
|
{ |
201
|
2 |
|
$this->set('DummyFullControllerClass', $value); |
202
|
2 |
|
$attributes = $this->parseAttribute($value); |
203
|
2 |
|
extract($attributes); |
204
|
|
|
|
205
|
2 |
|
return $this->setDefault('DummyNamespace', $dummyNamespace) |
206
|
2 |
|
->setDefault('DummyClass', $dummyClass) |
207
|
2 |
|
->setDefault('DummyRepositoryVariable', $dummyRepositoryVariable) |
208
|
2 |
|
->setDefault('DummyCollectionVariable', $dummyCollectionVariable) |
209
|
2 |
|
->setDefault('DummyModelVariable', $dummyModelVariable) |
210
|
2 |
|
->setDefault('DummyView', $dummyView) |
211
|
2 |
|
->setDefault('DummyRoute', $dummyRoute) |
212
|
2 |
|
->set('DummyControllerClass', $dummyClass); |
213
|
|
|
} |
214
|
|
|
|
215
|
|
|
/** |
216
|
|
|
* set. |
217
|
|
|
* |
218
|
|
|
* @param string $value |
219
|
|
|
* @return static |
220
|
|
|
*/ |
221
|
9 |
|
public function set($key, $value) |
222
|
|
|
{ |
223
|
9 |
|
$this->attributes[$key] = $value; |
224
|
|
|
|
225
|
9 |
|
return $this; |
226
|
|
|
} |
227
|
|
|
|
228
|
|
|
/** |
229
|
|
|
* setDefault. |
230
|
|
|
* |
231
|
|
|
* @param string $value |
232
|
|
|
* @return static |
233
|
|
|
*/ |
234
|
9 |
|
protected function setDefault($key, $value) |
235
|
|
|
{ |
236
|
9 |
|
if (isset($this->attributes[$key]) === false) { |
237
|
9 |
|
$this->attributes[$key] = $value; |
238
|
9 |
|
} |
239
|
|
|
|
240
|
9 |
|
return $this; |
241
|
|
|
} |
242
|
|
|
|
243
|
|
|
/** |
244
|
|
|
* get. |
245
|
|
|
* |
246
|
|
|
* @return string |
247
|
|
|
*/ |
248
|
7 |
|
public function get($key) |
249
|
|
|
{ |
250
|
7 |
|
return Arr::get($this->attributes, $key); |
251
|
|
|
} |
252
|
|
|
|
253
|
|
|
/** |
254
|
|
|
* remove. |
255
|
|
|
* |
256
|
|
|
* @param string $key |
257
|
|
|
* @return bool |
258
|
|
|
*/ |
259
|
2 |
|
public function remove($key) |
260
|
|
|
{ |
261
|
2 |
|
return Arr::forget($this->attributes, $key); |
262
|
|
|
} |
263
|
|
|
|
264
|
|
|
/** |
265
|
|
|
* render. |
266
|
|
|
* |
267
|
|
|
* @param string $stub |
268
|
|
|
* @param bool $orderedUses |
269
|
|
|
* @return string |
270
|
|
|
*/ |
271
|
8 |
|
public function render($stub, $orderedUses = true) |
272
|
|
|
{ |
273
|
8 |
|
$content = strtr(strtr(strtr($this->filesystem->get($stub), $this->attributes), ["\r\n" => "\n"]), [ |
274
|
8 |
|
' extends DummyBaseClass' => '', |
275
|
8 |
|
'use DummyFullBaseClass;' => '', |
276
|
8 |
|
]); |
277
|
|
|
|
278
|
8 |
|
return $orderedUses === true ? $this->orderedUses($content) : $content; |
279
|
|
|
} |
280
|
|
|
|
281
|
|
|
/** |
282
|
|
|
* renderServiceProvider. |
283
|
|
|
* |
284
|
|
|
* @param string $content |
285
|
|
|
* @return string |
286
|
|
|
*/ |
287
|
1 |
|
public function renderServiceProvider($content) |
288
|
|
|
{ |
289
|
1 |
|
if (strpos($content, '$this->registerRepositories') === false) { |
290
|
1 |
|
$content = preg_replace_callback('/public function register\(.+\n\s+{/', function ($m) { |
291
|
1 |
|
return $m[0]."\n". |
292
|
1 |
|
str_repeat(' ', 8). |
293
|
1 |
|
'$this->registerRepositories();'; |
294
|
1 |
|
}, $content); |
295
|
1 |
|
} |
296
|
|
|
|
297
|
1 |
|
if (strpos($content, 'protected function registerRepositories()') === false) { |
298
|
1 |
|
$content = substr($content, 0, strrpos($content, '}')). |
299
|
1 |
|
"\n".str_repeat(' ', 4). |
300
|
1 |
|
'protected function registerRepositories()'. |
301
|
1 |
|
"\n".str_repeat(' ', 4).'{'. |
302
|
1 |
|
"\n".str_repeat(' ', 4).'}'. |
303
|
1 |
|
"\n}\n"; |
304
|
1 |
|
} |
305
|
|
|
|
306
|
1 |
View Code Duplication |
if (strpos($content, sprintf('use %s;', $this->get('DummyFullRepositoryClass'))) === false) { |
|
|
|
|
307
|
1 |
|
$content = preg_replace_callback( |
308
|
1 |
|
'/namespace.+/', |
309
|
1 |
|
[$this, 'replaceServieProviderCallback'], |
310
|
|
|
$content |
311
|
1 |
|
); |
312
|
1 |
|
} |
313
|
|
|
|
314
|
1 |
View Code Duplication |
if (strpos($content, sprintf('$this->app->singleton(%sContract::class, %s::class);', $this->get('DummyClass'), $this->get('DummyClass'))) === false) { |
|
|
|
|
315
|
1 |
|
$content = preg_replace_callback( |
316
|
1 |
|
'/protected function registerRepositories.+\n\s+{/', |
317
|
1 |
|
[$this, 'replaceServieProviderCallback'], |
318
|
|
|
$content |
319
|
1 |
|
); |
320
|
1 |
|
} |
321
|
|
|
|
322
|
1 |
|
return $this->orderedUses($content); |
323
|
|
|
} |
324
|
|
|
|
325
|
|
|
/** |
326
|
|
|
* replaceServieProviderCallback. |
327
|
|
|
* |
328
|
|
|
* @param array $match |
329
|
|
|
* @return string |
330
|
|
|
*/ |
331
|
1 |
|
protected function replaceServieProviderCallback($match) |
332
|
|
|
{ |
333
|
1 |
|
$fullRepositoryClass = $this->get('DummyFullRepositoryClass'); |
334
|
1 |
|
$fullRepositoryInterface = $this->get('DummyFullRepositoryInterface'); |
335
|
1 |
|
$dummyClass = $this->get('DummyClass'); |
336
|
|
|
|
337
|
1 |
|
if (Str::startsWith($match[0], 'namespace') === true) { |
338
|
1 |
|
return $match[0]."\n\n". |
339
|
1 |
|
sprintf("use %s as %sContract;\n", $fullRepositoryInterface, $dummyClass). |
340
|
1 |
|
sprintf("use %s;\n", $fullRepositoryClass); |
341
|
|
|
} else { |
342
|
1 |
|
return $match[0]."\n". |
343
|
1 |
|
str_repeat(' ', 8). |
344
|
1 |
|
sprintf('$this->app->singleton(%sContract::class, %s::class);', $dummyClass, $dummyClass); |
345
|
|
|
} |
346
|
|
|
} |
347
|
|
|
|
348
|
|
|
/** |
349
|
|
|
* getNamespace. |
350
|
|
|
* |
351
|
|
|
* @param string $name |
352
|
|
|
* @return string |
353
|
|
|
*/ |
354
|
9 |
|
protected function getNamespace($name) |
355
|
|
|
{ |
356
|
9 |
|
return rtrim(preg_replace('/'.class_basename($name).'$/', '', $name), '\\'); |
357
|
|
|
} |
358
|
|
|
|
359
|
|
|
|
360
|
|
|
/** |
361
|
|
|
* orderedUses. |
362
|
|
|
* |
363
|
|
|
* @param string $content |
364
|
|
|
* @return string |
365
|
|
|
*/ |
366
|
9 |
|
protected function orderedUses($content) |
367
|
|
|
{ |
368
|
9 |
|
$fix = $this->useSortFixer->fix($content); |
369
|
|
|
|
370
|
9 |
|
return $fix === false ? $content : strtr($fix, ["\r\n" => "\n"]); |
371
|
|
|
} |
372
|
|
|
} |
373
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.