Просмотр файла app/Http/Controllers/Admin/ModuleController.php

Размер файла: 5.21Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers\Admin;
  6.  
  7. use App\Models\Module;
  8. use Illuminate\Http\RedirectResponse;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Artisan;
  11. use Illuminate\View\View;
  12.  
  13. class ModuleController extends AdminController
  14. {
  15. /**
  16. * Главная страница
  17. *
  18. * @return View
  19. */
  20. public function index(): View
  21. {
  22. $modules = Module::query()->get();
  23. $moduleInstall = [];
  24. foreach ($modules as $module) {
  25. $moduleInstall[$module->name] = $module;
  26. }
  27.  
  28. $moduleNames = [];
  29. $modulesLoaded = glob(base_path('modules/*'), GLOB_ONLYDIR);
  30. foreach ($modulesLoaded as $module) {
  31. if (file_exists($module . '/module.php')) {
  32. $moduleNames[basename($module)] = include $module . '/module.php';
  33. }
  34. }
  35.  
  36. return view('admin/modules/index', compact('moduleInstall', 'moduleNames'));
  37. }
  38.  
  39. /**
  40. * Просмотр модуля
  41. *
  42. * @param Request $request
  43. *
  44. * @return View
  45. */
  46. public function module(Request $request): View
  47. {
  48. $moduleName = $request->input('module');
  49. $modulePath = base_path('modules/' . $moduleName);
  50.  
  51. if (! preg_match('|^[A-Z][\w\-]+$|', $moduleName) || ! file_exists($modulePath)) {
  52. abort(200, __('admin.modules.module_not_found'));
  53. }
  54.  
  55. $moduleConfig = include $modulePath . '/module.php';
  56.  
  57. if (file_exists($modulePath . '/screenshots')) {
  58. $moduleConfig['screenshots'] = glob($modulePath . '/screenshots/*.{gif,png,jpg,jpeg}', GLOB_BRACE);
  59. }
  60.  
  61. if (file_exists($modulePath . '/migrations')) {
  62. $moduleConfig['migrations'] = array_map('basename', glob($modulePath . '/migrations/*.php'));
  63. }
  64.  
  65. if (file_exists($modulePath . '/resources/assets')) {
  66. $moduleConfig['symlink'] = (new Module())->getLinkName($modulePath);
  67. }
  68.  
  69. $module = Module::query()->where('name', $moduleName)->first();
  70.  
  71. return view('admin/modules/module', compact('module', 'moduleConfig', 'moduleName'));
  72. }
  73.  
  74. /**
  75. * Установка модуля
  76. *
  77. * @param Request $request
  78. *
  79. * @return RedirectResponse
  80. */
  81. public function install(Request $request): RedirectResponse
  82. {
  83. $moduleName = $request->input('module');
  84. $enable = int($request->input('enable'));
  85. $update = int($request->input('update'));
  86. $modulePath = base_path('modules/' . $moduleName);
  87.  
  88. if (! preg_match('|^[A-Z][\w\-]+$|', $moduleName) || ! file_exists($modulePath)) {
  89. abort(200, __('admin.modules.module_not_found'));
  90. }
  91.  
  92. /** @var Module $module */
  93. $module = Module::query()->firstOrNew(['name' => $moduleName]);
  94.  
  95. $moduleConfig = include $modulePath . '/module.php';
  96. $module->createSymlink($modulePath);
  97. $module->migrate($modulePath);
  98.  
  99. Artisan::call('route:clear');
  100. $result = __('admin.modules.module_success_installed');
  101.  
  102. if ($module->exists) {
  103. if ($update) {
  104. $module->update([
  105. 'version' => $moduleConfig['version'],
  106. 'updated_at' => SITETIME,
  107. ]);
  108. $result = __('admin.modules.module_success_updated');
  109. }
  110.  
  111. if ($enable) {
  112. $module->update([
  113. 'disabled' => 0,
  114. 'updated_at' => SITETIME,
  115. ]);
  116. $result = __('admin.modules.module_success_enabled');
  117. }
  118. } else {
  119. $module->fill([
  120. 'version' => $moduleConfig['version'],
  121. 'updated_at' => SITETIME,
  122. 'created_at' => SITETIME,
  123. ])->save();
  124. }
  125.  
  126. setFlash('success', $result);
  127.  
  128. return redirect('admin/modules/module?module=' . $moduleName);
  129. }
  130.  
  131. /**
  132. * Удаление/Выключение модуля
  133. *
  134. * @param Request $request
  135. *
  136. * @return RedirectResponse
  137. */
  138. public function uninstall(Request $request): RedirectResponse
  139. {
  140. $moduleName = $request->input('module');
  141. $disable = int($request->input('disable'));
  142. $modulePath = base_path('modules/' . $moduleName);
  143.  
  144. if (! preg_match('|^[A-Z][\w\-]+$|', $moduleName) || ! file_exists($modulePath)) {
  145. abort(200, __('admin.modules.module_not_found'));
  146. }
  147.  
  148. /** @var Module $module */
  149. $module = Module::query()->where('name', $moduleName)->first();
  150. if (! $module) {
  151. abort(200, __('admin.modules.module_not_found'));
  152. }
  153.  
  154. $module->deleteSymlink($modulePath);
  155. Artisan::call('route:clear');
  156.  
  157. if ($disable) {
  158. $module->update([
  159. 'disabled' => 1,
  160. 'updated_at' => SITETIME,
  161. ]);
  162. $result = __('admin.modules.module_success_disabled');
  163. } else {
  164. $module->rollback($modulePath);
  165. $module->delete();
  166. $result = __('admin.modules.module_success_deleted');
  167. }
  168.  
  169. setFlash('success', $result);
  170.  
  171. return redirect('admin/modules/module?module=' . $moduleName);
  172. }
  173. }