Total Complexity | 41 |
Total Lines | 468 |
Duplicated Lines | 0 % |
Changes | 0 |
Complex classes like MaintenanceController often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use MaintenanceController, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
42 | class MaintenanceController extends AbstractController |
||
43 | { |
||
44 | /** |
||
45 | * Main "show the cards" view |
||
46 | * |
||
47 | * @param ServerRequestInterface $request |
||
48 | * @return ResponseInterface |
||
49 | */ |
||
50 | public function cardsAction(ServerRequestInterface $request): ResponseInterface |
||
51 | { |
||
52 | $view = $this->initializeStandaloneView($request, 'Maintenance/Cards.html'); |
||
53 | $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); |
||
54 | $view->assignMultiple([ |
||
55 | 'clearAllCacheOpcodeCaches' => (new OpcodeCacheService())->getAllActive(), |
||
56 | 'clearTablesClearToken' => $formProtection->generateToken('installTool', 'clearTablesClear'), |
||
57 | 'clearTypo3tempFilesToken' => $formProtection->generateToken('installTool', 'clearTypo3tempFiles'), |
||
58 | 'createAdminToken' => $formProtection->generateToken('installTool', 'createAdmin'), |
||
59 | 'databaseAnalyzerExecuteToken' => $formProtection->generateToken('installTool', 'databaseAnalyzerExecute'), |
||
60 | ]); |
||
61 | return new JsonResponse([ |
||
62 | 'success' => true, |
||
63 | 'html' => $view->render(), |
||
64 | ]); |
||
65 | } |
||
66 | |||
67 | /** |
||
68 | * Clear cache framework and opcode caches |
||
69 | * |
||
70 | * @return ResponseInterface |
||
71 | */ |
||
72 | public function cacheClearAllAction(): ResponseInterface |
||
82 | ]); |
||
83 | } |
||
84 | |||
85 | /** |
||
86 | * Clear typo3temp files statistics action |
||
87 | * |
||
88 | * @return ResponseInterface |
||
89 | */ |
||
90 | public function clearTypo3tempFilesStatsAction(): ResponseInterface |
||
91 | { |
||
92 | return new JsonResponse( |
||
93 | [ |
||
94 | 'success' => true, |
||
95 | 'stats' => (new Typo3tempFileService())->getDirectoryStatistics(), |
||
96 | ] |
||
97 | ); |
||
98 | } |
||
99 | |||
100 | /** |
||
101 | * Clear Processed Files |
||
102 | * |
||
103 | * @param ServerRequestInterface $request |
||
104 | * @return ResponseInterface |
||
105 | */ |
||
106 | public function clearTypo3tempFilesAction(ServerRequestInterface $request): ResponseInterface |
||
107 | { |
||
108 | $messageQueue = new FlashMessageQueue('install'); |
||
109 | $typo3tempFileService = new Typo3tempFileService(); |
||
110 | $folder = $request->getParsedBody()['install']['folder']; |
||
111 | if ($folder === '_processed_') { |
||
112 | $failedDeletions = $typo3tempFileService->clearProcessedFiles(); |
||
113 | if ($failedDeletions) { |
||
114 | $messageQueue->enqueue(new FlashMessage( |
||
115 | 'Failed to delete ' . $failedDeletions . ' processed files. See TYPO3 log (by default typo3temp/var/logs/typo3_*.log)', |
||
116 | '', |
||
117 | FlashMessage::ERROR |
||
118 | )); |
||
119 | } else { |
||
120 | $messageQueue->enqueue(new FlashMessage('Cleared processed files')); |
||
121 | } |
||
122 | } else { |
||
123 | $typo3tempFileService->clearAssetsFolder($folder); |
||
124 | $messageQueue->enqueue(new FlashMessage('Cleared files in "' . $folder . '" folder')); |
||
125 | } |
||
126 | return new JsonResponse([ |
||
127 | 'success' => true, |
||
128 | 'status' => $messageQueue, |
||
129 | ]); |
||
130 | } |
||
131 | |||
132 | /** |
||
133 | * Dump autoload information |
||
134 | * |
||
135 | * @return ResponseInterface |
||
136 | */ |
||
137 | public function dumpAutoloadAction(): ResponseInterface |
||
138 | { |
||
139 | $messageQueue = new FlashMessageQueue('install'); |
||
140 | if (Bootstrap::usesComposerClassLoading()) { |
||
141 | $messageQueue->enqueue(new FlashMessage( |
||
142 | '', |
||
143 | 'Skipped generating additional class loading information in composer mode.', |
||
144 | FlashMessage::NOTICE |
||
145 | )); |
||
146 | } else { |
||
147 | ClassLoadingInformation::dumpClassLoadingInformation(); |
||
148 | $messageQueue->enqueue(new FlashMessage( |
||
149 | '', |
||
150 | 'Successfully dumped class loading information for extensions.' |
||
151 | )); |
||
152 | } |
||
153 | return new JsonResponse([ |
||
154 | 'success' => true, |
||
155 | 'status' => $messageQueue, |
||
156 | ]); |
||
157 | } |
||
158 | |||
159 | /** |
||
160 | * Analyze current database situation |
||
161 | * |
||
162 | * @return ResponseInterface |
||
163 | */ |
||
164 | public function databaseAnalyzerAnalyzeAction(): ResponseInterface |
||
317 | ]); |
||
318 | } |
||
319 | |||
320 | /** |
||
321 | * Apply selected database changes |
||
322 | * |
||
323 | * @param ServerRequestInterface $request |
||
324 | * @return ResponseInterface |
||
325 | */ |
||
326 | public function databaseAnalyzerExecuteAction(ServerRequestInterface $request): ResponseInterface |
||
327 | { |
||
328 | $this->loadExtLocalconfDatabaseAndExtTables(); |
||
329 | $messageQueue = new FlashMessageQueue('install'); |
||
330 | $selectedHashes = $request->getParsedBody()['install']['hashes'] ?? []; |
||
331 | if (empty($selectedHashes)) { |
||
332 | $messageQueue->enqueue(new FlashMessage( |
||
333 | '', |
||
334 | 'No database changes selected', |
||
335 | FlashMessage::WARNING |
||
336 | )); |
||
337 | } else { |
||
338 | $sqlReader = GeneralUtility::makeInstance(SqlReader::class); |
||
339 | $sqlStatements = $sqlReader->getCreateTableStatementArray($sqlReader->getTablesDefinitionString()); |
||
340 | $schemaMigrationService = GeneralUtility::makeInstance(SchemaMigrator::class); |
||
341 | $statementHashesToPerform = array_flip($selectedHashes); |
||
342 | $results = $schemaMigrationService->migrate($sqlStatements, $statementHashesToPerform); |
||
343 | // Create error flash messages if any |
||
344 | foreach ($results as $errorMessage) { |
||
345 | $messageQueue->enqueue(new FlashMessage( |
||
346 | 'Error: ' . $errorMessage, |
||
347 | 'Database update failed', |
||
348 | FlashMessage::ERROR |
||
349 | )); |
||
350 | } |
||
351 | $messageQueue->enqueue(new FlashMessage( |
||
352 | '', |
||
353 | 'Executed database updates' |
||
354 | )); |
||
355 | } |
||
356 | return new JsonResponse([ |
||
357 | 'success' => true, |
||
358 | 'status' => $messageQueue, |
||
359 | ]); |
||
360 | } |
||
361 | |||
362 | /** |
||
363 | * Clear table overview statistics action |
||
364 | * |
||
365 | * @return ResponseInterface |
||
366 | */ |
||
367 | public function clearTablesStatsAction(): ResponseInterface |
||
372 | ]); |
||
373 | } |
||
374 | |||
375 | /** |
||
376 | * Truncate a specific table |
||
377 | * |
||
378 | * @param ServerRequestInterface $request |
||
379 | * @return ResponseInterface |
||
380 | */ |
||
381 | public function clearTablesClearAction(ServerRequestInterface $request): ResponseInterface |
||
382 | { |
||
383 | $table = $request->getParsedBody()['install']['table']; |
||
384 | if (empty($table)) { |
||
385 | throw new \RuntimeException( |
||
386 | 'No table name given', |
||
387 | 1501944076 |
||
388 | ); |
||
389 | } |
||
390 | (new ClearTableService())->clearSelectedTable($table); |
||
391 | $messageQueue = (new FlashMessageQueue('install'))->enqueue( |
||
392 | new FlashMessage('Cleared table') |
||
393 | ); |
||
394 | return new JsonResponse([ |
||
395 | 'success' => true, |
||
396 | 'status' => $messageQueue |
||
397 | ]); |
||
398 | } |
||
399 | |||
400 | /** |
||
401 | * Create a backend administrator from given username and password |
||
402 | * |
||
403 | * @param ServerRequestInterface $request |
||
404 | * @return ResponseInterface |
||
405 | */ |
||
406 | public function createAdminAction(ServerRequestInterface $request): ResponseInterface |
||
487 | ]); |
||
488 | } |
||
489 | |||
490 | /** |
||
491 | * Set 'uc' field of all backend users to empty string |
||
492 | * |
||
493 | * @return ResponseInterface |
||
494 | */ |
||
495 | public function resetBackendUserUcAction(): ResponseInterface |
||
510 | ]); |
||
511 | } |
||
512 | } |
||
513 |