Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
1 | <?php |
||
9 | class Generator |
||
10 | { |
||
11 | /** |
||
12 | * @param string $path |
||
13 | * @param string $type |
||
14 | * @param array $properties |
||
15 | */ |
||
16 | 19 | public function generateAddon($path, $type, array $properties) |
|
17 | { |
||
18 | 19 | $generator = FileGenerator::make($path, __DIR__.'/stubs/'.$type); |
|
19 | |||
20 | 19 | $method = 'generate'.studly_case($type); |
|
21 | |||
22 | 19 | call_user_func([$this, $method], $generator, $properties); |
|
23 | 19 | } |
|
24 | |||
25 | 8 | protected function generateMinimum(FileGenerator $generator, array $properties) |
|
26 | { |
||
27 | 8 | $generator->directory('classes') |
|
28 | 8 | ->file('AddonServiceProvider.php')->template('AddonServiceProvider.php', $properties); |
|
29 | |||
30 | 8 | $this->generateAddonConfig($generator, $properties['namespace'], [ |
|
31 | 8 | 'namespace' => new Constant('__NAMESPACE__'), |
|
32 | 'directories' => [ |
||
33 | 8 | 'classes', |
|
34 | 8 | ], |
|
35 | 'paths' => [ |
||
36 | 8 | ], |
|
37 | 'providers' => [ |
||
38 | 8 | new ClassName('AddonServiceProvider'), |
|
39 | 8 | ], |
|
40 | 8 | ]); |
|
41 | 8 | } |
|
42 | |||
43 | 3 | protected function generateSimple(FileGenerator $generator, array $properties) |
|
44 | { |
||
45 | $generator->directory('classes', function ($generator) use ($properties) { |
||
46 | 3 | $generator->directory('Providers') |
|
47 | 2 | ->file('AddonServiceProvider.php')->template('AddonServiceProvider.php', $properties); |
|
48 | 2 | $generator->directory('Providers') |
|
49 | 2 | ->file('RouteServiceProvider.php')->template('RouteServiceProvider.php', $properties); |
|
50 | |||
51 | 2 | $generator->directory('Http')->phpBlankFile('routes.php'); |
|
52 | 2 | $generator->keepDirectory('Http/Controllers'); |
|
53 | |||
54 | 2 | $generator->keepDirectory('Services'); |
|
55 | 2 | }); |
|
56 | |||
57 | 2 | $generator->keepDirectory('config'); |
|
58 | |||
59 | $generator->directory('resources', function ($generator) use ($properties) { |
||
60 | $this->generateLang($generator, $properties, function ($generator) use ($properties) { |
||
61 | 2 | $generator->gitKeepFile(); |
|
62 | 2 | }); |
|
63 | |||
64 | 2 | $generator->keepDirectory('views'); |
|
65 | 2 | }); |
|
66 | |||
67 | 2 | $generator->phpBlankFile('helpers.php'); |
|
68 | |||
69 | 2 | $this->generateAddonConfig($generator, $properties['namespace'], [ |
|
70 | 2 | 'namespace' => new Constant('__NAMESPACE__'), |
|
71 | 'directories' => [ |
||
72 | 2 | 'classes', |
|
73 | 2 | ], |
|
74 | 'files' => [ |
||
75 | 2 | 'helpers.php', |
|
76 | 2 | ], |
|
77 | 'paths' => [ |
||
78 | 2 | 'config' => 'config', |
|
79 | 2 | 'lang' => 'resources/lang', |
|
80 | 2 | 'views' => 'resources/views', |
|
81 | 2 | ], |
|
82 | 'providers' => [ |
||
83 | 2 | new ClassName('Providers\AddonServiceProvider'), |
|
84 | 2 | new ClassName('Providers\RouteServiceProvider'), |
|
85 | 2 | ], |
|
86 | 'http' => [ |
||
87 | 2 | 'prefix' => 'addons/'.$properties['addon_name'], |
|
88 | 2 | ], |
|
89 | 2 | ]); |
|
90 | 2 | } |
|
91 | |||
92 | 2 | protected function generateLibrary(FileGenerator $generator, array $properties) |
|
143 | |||
144 | 2 | protected function generateApi(FileGenerator $generator, array $properties) |
|
145 | { |
||
146 | $generator->directory('classes', function ($generator) use ($properties) { |
||
147 | 2 | $generator->directory('Providers') |
|
148 | 2 | ->file('AddonServiceProvider.php')->template('AddonServiceProvider.php', $properties); |
|
149 | 2 | $generator->directory('Providers') |
|
150 | 2 | ->file('RouteServiceProvider.php')->template('RouteServiceProvider.php', $properties); |
|
151 | |||
152 | 2 | $generator->keepDirectory('Console/Commands'); |
|
153 | |||
154 | 2 | $generator->directory('Http') |
|
155 | 2 | ->file('routes.php')->template('routes.php', $properties); |
|
156 | 2 | $generator->directory('Http/Controllers') |
|
157 | 2 | ->file('Controller.php')->template('Controller.php', $properties); |
|
158 | 2 | $generator->keepDirectory('Http/Middleware'); |
|
159 | |||
160 | 2 | $generator->keepDirectory('Services'); |
|
161 | 2 | }); |
|
162 | |||
163 | 2 | $generator->keepDirectory('config'); |
|
164 | |||
165 | $generator->directory('resources', function ($generator) use ($properties) { |
||
166 | $this->generateLang($generator, $properties, function ($generator) use ($properties) { |
||
167 | 2 | $generator->phpConfigFile('messages.php', []); |
|
168 | 2 | $generator->phpConfigFile('vocabulary.php', []); |
|
169 | 2 | $generator->phpConfigFile('methods.php', []); |
|
170 | 2 | }); |
|
171 | |||
172 | 2 | $generator->directory('specs')->phpConfigFile('methods.php', []); |
|
173 | 2 | }); |
|
174 | |||
175 | $generator->directory('tests', function ($generator) use ($properties) { |
||
176 | 2 | $generator->file('TestCase.php')->template('TestCase.php', $properties); |
|
177 | 2 | }); |
|
178 | |||
179 | 2 | $generator->phpBlankFile('helpers.php'); |
|
180 | |||
181 | 2 | $this->generateAddonConfig($generator, $properties['namespace'], [ |
|
182 | 2 | 'namespace' => new Constant('__NAMESPACE__'), |
|
183 | 'directories' => [ |
||
184 | 2 | 'classes', |
|
185 | 2 | ], |
|
186 | 'files' => [ |
||
187 | 2 | 'helpers.php', |
|
188 | 2 | ], |
|
189 | 'paths' => [ |
||
190 | 2 | 'config' => 'config', |
|
191 | 2 | 'lang' => 'resources/lang', |
|
192 | 2 | 'specs' => 'resources/specs', |
|
193 | 2 | ], |
|
194 | 'providers' => [ |
||
195 | 2 | new ClassName('Providers\AddonServiceProvider'), |
|
196 | 2 | new ClassName('Providers\RouteServiceProvider'), |
|
197 | 2 | ], |
|
198 | 'http' => [ |
||
199 | 2 | 'prefix' => 'addons/'.$properties['addon_name'], |
|
200 | 2 | ], |
|
201 | 2 | ]); |
|
202 | 2 | } |
|
203 | |||
204 | 5 | protected function generateUi(FileGenerator $generator, array $properties) |
|
205 | { |
||
206 | $generator->directory('classes', function ($generator) use ($properties) { |
||
207 | 4 | $migration_class = $properties['addon_class'].'_1_0'; |
|
208 | |||
209 | 4 | $generator->directory('Providers') |
|
210 | 4 | ->file('AddonServiceProvider.php')->template('AddonServiceProvider.php', $properties); |
|
211 | 4 | $generator->directory('Providers') |
|
212 | 4 | ->file('DatabaseServiceProvider.php')->template('DatabaseServiceProvider.php', array_merge($properties, ['migration_class_name' => $migration_class])); |
|
213 | 4 | $generator->directory('Providers') |
|
214 | 4 | ->file('RouteServiceProvider.php')->template('RouteServiceProvider.php', $properties); |
|
215 | |||
216 | 4 | $generator->keepDirectory('Console/Commands'); |
|
217 | |||
218 | 4 | $generator->directory('Database/Migrations') |
|
219 | 4 | ->file($migration_class.'.php')->template('Migration.php', array_merge($properties, ['class_name' => $migration_class])); |
|
220 | 4 | $generator->keepDirectory('Database/Seeds'); |
|
221 | |||
222 | 4 | $generator->directory('Http') |
|
223 | 4 | ->file('routes.php')->template('routes.php', $properties); |
|
224 | 4 | $generator->directory('Http/Controllers') |
|
225 | 4 | ->file('Controller.php')->template('Controller.php', $properties); |
|
226 | 4 | $generator->keepDirectory('Http/Middleware'); |
|
227 | |||
228 | 4 | $generator->keepDirectory('Services'); |
|
229 | 4 | }); |
|
230 | |||
231 | 4 | $generator->keepDirectory('config'); |
|
232 | |||
233 | $generator->directory('resources', function ($generator) use ($properties) { |
||
234 | 4 | $generator->keepDirectory('assets'); |
|
235 | |||
236 | $this->generateLang($generator, $properties, function ($generator) use ($properties) { |
||
237 | 4 | $generator->phpConfigFile('messages.php', []); |
|
238 | 4 | $generator->phpConfigFile('vocabulary.php', []); |
|
239 | 4 | $generator->phpConfigFile('forms.php', []); |
|
240 | 4 | }); |
|
241 | |||
242 | 4 | $generator->directory('specs')->phpConfigFile('forms.php', []); |
|
243 | |||
244 | 4 | $generator->directory('views') |
|
245 | 4 | ->file('index.blade.php')->template('index.blade.php', $properties); |
|
246 | 4 | $generator->directory('views') |
|
247 | 4 | ->file('layout.blade.php')->template('layout.blade.php', $properties); |
|
248 | 5 | }); |
|
249 | |||
250 | $generator->directory('tests', function ($generator) use ($properties) { |
||
251 | 4 | $generator->file('TestCase.php')->template('TestCase.php', $properties); |
|
252 | 4 | }); |
|
253 | |||
254 | 4 | $generator->phpBlankFile('helpers.php'); |
|
255 | |||
256 | 4 | $this->generateAddonConfig($generator, $properties['namespace'], [ |
|
257 | 4 | 'namespace' => new Constant('__NAMESPACE__'), |
|
258 | 'directories' => [ |
||
259 | 4 | 'classes', |
|
260 | 4 | ], |
|
261 | 'files' => [ |
||
262 | 4 | 'helpers.php', |
|
263 | 4 | ], |
|
264 | 'paths' => [ |
||
265 | 4 | 'config' => 'config', |
|
266 | 4 | 'assets' => 'resources/assets', |
|
267 | 4 | 'lang' => 'resources/lang', |
|
268 | 4 | 'specs' => 'resources/specs', |
|
269 | 4 | 'views' => 'resources/views', |
|
270 | 4 | ], |
|
271 | 'providers' => [ |
||
272 | 4 | new ClassName('Providers\AddonServiceProvider'), |
|
273 | 4 | new ClassName('Providers\DatabaseServiceProvider'), |
|
274 | 4 | new ClassName('Providers\RouteServiceProvider'), |
|
275 | 4 | ], |
|
276 | 'http' => [ |
||
277 | 4 | 'prefix' => 'addons/'.$properties['addon_name'], |
|
278 | 4 | ], |
|
279 | 4 | ]); |
|
280 | 4 | } |
|
281 | |||
282 | 2 | protected function generateDebug(FileGenerator $generator, array $properties) |
|
283 | { |
||
284 | View Code Duplication | $generator->directory('classes', function ($generator) use ($properties) { |
|
|
|||
285 | 2 | $generator->directory('Providers') |
|
286 | 2 | ->file('AddonServiceProvider.php')->template('AddonServiceProvider.php', $properties); |
|
287 | 2 | $generator->directory('Providers') |
|
288 | 2 | ->file('RouteServiceProvider.php')->template('RouteServiceProvider.php', $properties); |
|
289 | |||
290 | 2 | $generator->keepDirectory('Console/Commands'); |
|
291 | |||
292 | 2 | $generator->directory('Http') |
|
293 | 2 | ->file('routes.php')->template('routes.php', $properties); |
|
294 | 2 | $generator->directory('Http/Controllers') |
|
295 | 2 | ->file('Controller.php')->template('Controller.php', $properties); |
|
296 | 2 | $generator->directory('Http/Controllers') |
|
297 | 2 | ->file('DebugController.php')->template('DebugController.php', $properties); |
|
298 | 2 | $generator->keepDirectory('Http/Middleware'); |
|
299 | |||
300 | 2 | $generator->keepDirectory('Services'); |
|
301 | 2 | }); |
|
302 | |||
303 | 2 | $generator->keepDirectory('config'); |
|
304 | |||
305 | $generator->directory('resources', function ($generator) use ($properties) { |
||
306 | $this->generateLang($generator, $properties, function ($generator) use ($properties) { |
||
307 | 2 | $generator->phpConfigFile('messages.php', []); |
|
308 | 2 | $generator->phpConfigFile('vocabulary.php', []); |
|
309 | 2 | $generator->phpConfigFile('forms.php', []); |
|
310 | 2 | $generator->phpConfigFile('methods.php', []); |
|
311 | 2 | }); |
|
312 | |||
313 | 2 | $generator->directory('specs')->phpConfigFile('forms.php', []); |
|
314 | 2 | $generator->directory('specs')->phpConfigFile('methods.php', []); |
|
315 | |||
316 | 2 | $generator->directory('views') |
|
317 | 2 | ->file('index.blade.php')->template('index.blade.php', $properties); |
|
318 | 2 | $generator->directory('views') |
|
319 | 2 | ->file('layout.blade.php')->template('layout.blade.php', $properties); |
|
320 | 2 | }); |
|
321 | |||
322 | 2 | $generator->phpBlankFile('helpers.php'); |
|
323 | |||
324 | 2 | $this->generateAddonConfig($generator, $properties['namespace'], [ |
|
325 | 2 | 'namespace' => new Constant('__NAMESPACE__'), |
|
326 | 'directories' => [ |
||
327 | 2 | 'classes', |
|
328 | 2 | ], |
|
329 | 'files' => [ |
||
330 | 2 | 'helpers.php', |
|
331 | 2 | ], |
|
332 | 'paths' => [ |
||
333 | 2 | 'config' => 'config', |
|
334 | 2 | 'lang' => 'resources/lang', |
|
335 | 2 | 'specs' => 'resources/specs', |
|
336 | 2 | 'views' => 'resources/views', |
|
337 | 2 | ], |
|
338 | 'providers' => [ |
||
339 | 2 | new ClassName('Providers\AddonServiceProvider'), |
|
340 | 2 | new ClassName('Providers\RouteServiceProvider'), |
|
341 | 2 | ], |
|
342 | 'http' => [ |
||
343 | 2 | 'prefix' => 'debug', |
|
344 | 2 | ], |
|
345 | 2 | ]); |
|
346 | 2 | } |
|
347 | |||
348 | 2 | protected function generateGenerator(FileGenerator $generator, array $properties) |
|
395 | |||
396 | 2 | protected function generateLaravel5(FileGenerator $generator, array $properties) |
|
464 | |||
465 | 2 | protected function generateSampleUi(FileGenerator $generator, array $properties) |
|
466 | { |
||
467 | $generator->directory('classes', function ($generator) use ($properties) { |
||
468 | 2 | $migration_class = $properties['addon_class'].'_1_0'; |
|
469 | |||
470 | 2 | $generator->directory('Providers') |
|
548 | |||
549 | 2 | protected function generateSampleAuth(FileGenerator $generator, array $properties) |
|
623 | |||
624 | protected function generateLang(FileGenerator $generator, array $properties, callable $callable) |
||
632 | |||
633 | 19 | protected function generateAddonConfig(FileGenerator $generator, $namespace, array $data) |
|
674 | } |
||
675 |
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.