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

Размер файла: 8.61Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\News;
  9. use App\Models\Setting;
  10. use App\Models\User;
  11. use Illuminate\Http\RedirectResponse;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Facades\Artisan;
  14. use Illuminate\Support\Facades\Lang;
  15. use Illuminate\Support\Facades\Schema;
  16. use Illuminate\View\View;
  17.  
  18. class InstallController extends Controller
  19. {
  20. public function __construct(Request $request)
  21. {
  22. $lang = $request->input('lang', 'ru');
  23.  
  24. Lang::setLocale($lang);
  25.  
  26. view()->share('lang', $lang);
  27. }
  28.  
  29. /**
  30. * Главная страница
  31. *
  32. * @return View
  33. */
  34. public function index(): View
  35. {
  36. $keys = [
  37. 'APP_ENV',
  38. 'APP_DEBUG',
  39. 'DB_CONNECTION',
  40. 'DB_HOST',
  41. 'DB_PORT',
  42. 'DB_DATABASE',
  43. 'DB_USERNAME',
  44. 'APP_URL',
  45. 'APP_EMAIL',
  46. 'APP_ADMIN',
  47. ];
  48.  
  49. $versions = [
  50. 'php' => '7.3.0',
  51. 'mysql' => '5.7.8',
  52. 'maria' => '10.2.7',
  53. 'pgsql' => '9.2',
  54. ];
  55.  
  56. $storage = glob(storage_path('{*,*/*,*/*/*}'), GLOB_BRACE | GLOB_ONLYDIR);
  57. $uploads = glob(public_path('uploads/*'), GLOB_ONLYDIR);
  58. $dirs = [public_path('assets/modules'), base_path('bootstrap/cache')];
  59.  
  60. $dirs = array_merge($storage, $uploads, $dirs);
  61. $languages = array_map('basename', glob(resource_path('lang/*'), GLOB_ONLYDIR));
  62.  
  63. return view('install/index', compact('keys', 'languages', 'versions', 'dirs'));
  64. }
  65.  
  66. /**
  67. * Проверка статуса
  68. *
  69. * @return View
  70. */
  71. public function status(): View
  72. {
  73. if (! Schema::hasTable('migrations')) {
  74. Artisan::call('migrate:install');
  75. }
  76.  
  77. Artisan::call('migrate:status');
  78. $output = Artisan::output();
  79.  
  80. return view('install/status', compact('output'));
  81. }
  82.  
  83. /**
  84. * Выполнение миграций
  85. *
  86. * @return View
  87. */
  88. public function migrate(): View
  89. {
  90. Artisan::call('migrate', ['--force' => true]);
  91. $output = Artisan::output();
  92.  
  93. if (! setting('app_installed')) {
  94. Artisan::call('key:generate', ['--force' => true]);
  95. }
  96.  
  97. return view('install/migrate', compact('output'));
  98. }
  99.  
  100. /**
  101. * Заполнение БД
  102. *
  103. * @return View
  104. */
  105. public function seed(): View
  106. {
  107. Artisan::call('db:seed', ['--force' => true]);
  108. $output = Artisan::output();
  109.  
  110. Artisan::call('cache:clear');
  111. Artisan::call('route:clear');
  112. Artisan::call('config:clear');
  113.  
  114. return view('install/seed', compact('output'));
  115. }
  116.  
  117. /**
  118. * Создание администратора
  119. *
  120. * @param Request $request
  121. * @param Validator $validator
  122. *
  123. * @return View|RedirectResponse
  124. */
  125. public function account(Request $request, Validator $validator)
  126. {
  127. $lang = $request->input('lang', 'ru');
  128. $login = $request->input('login');
  129. $password = $request->input('password');
  130. $password2 = $request->input('password2');
  131. $email = $request->input('email');
  132.  
  133. if ($request->isMethod('post')) {
  134. $validator->regex($login, '|^[a-z0-9\-]+$|i', ['login' => __('validator.login')])
  135. ->regex(utfSubstr($login, 0, 1), '|^[a-z0-9]+$|i', ['login' => __('users.login_begin_requirements')])
  136. ->email($email, ['email' => __('validator.email')])
  137. ->length($login, 3, 20, ['login' => __('users.login_length_requirements')])
  138. ->length($password, 6, 20, ['password' => __('users.password_length_requirements')])
  139. ->equal($password, $password2, ['password2' => __('users.passwords_different')])
  140. ->false(ctype_digit($login), ['login' => __('users.field_characters_requirements')])
  141. ->false(ctype_digit($password), ['password' => __('users.field_characters_requirements')])
  142. ->false(substr_count($login, '-') > 2, ['login' => __('users.login_hyphens_requirements')]);
  143.  
  144. if ($validator->isValid()) {
  145. // Проверка логина на существование
  146. $checkLogin = User::query()->where('login', $login)->exists();
  147. $validator->false($checkLogin, ['login' => __('users.login_already_exists')]);
  148.  
  149. // Проверка email на существование
  150. $checkMail = User::query()->where('email', $email)->exists();
  151. $validator->false($checkMail, ['email' => __('users.email_already_exists')]);
  152. }
  153.  
  154. if ($validator->isValid()) {
  155. /** @var User $user */
  156. $user = User::query()->create([
  157. 'login' => $login,
  158. 'password' => password_hash($password, PASSWORD_BCRYPT),
  159. 'email' => strtolower($email),
  160. 'level' => User::BOSS,
  161. 'gender' => User::MALE,
  162. 'themes' => 'default',
  163. 'point' => 500,
  164. 'money' => 100000,
  165. 'status' => 'Boss',
  166. 'language' => $lang,
  167. 'created_at' => SITETIME,
  168. ]);
  169.  
  170. // ------------- Авторизация -----------//
  171. User::auth($login, $password);
  172.  
  173. // -------------- Приват ---------------//
  174. $text = __('install.text_message', ['login' => $login]);
  175. $user->sendMessage(null, $text);
  176.  
  177. // -------------- Новость ---------------//
  178. $textnews = __('install.text_news');
  179.  
  180. News::query()->create([
  181. 'title' => __('install.welcome'),
  182. 'text' => $textnews,
  183. 'user_id' => $user->id,
  184. 'created_at' => SITETIME,
  185. ]);
  186.  
  187. // -------------- Установка -------------//
  188. Setting::query()
  189. ->where('name', 'app_installed')
  190. ->update([
  191. 'value' => 1,
  192. ]);
  193.  
  194. clearCache(['statNews', 'lastNews', 'statNewsDate', 'settings']);
  195.  
  196. return redirect('/install/finish');
  197. }
  198.  
  199. setInput($request->all());
  200. setFlash('danger', $validator->getErrors());
  201. }
  202.  
  203. return view('install/account', compact('login', 'email'));
  204. }
  205.  
  206. /**
  207. * Завершение установки
  208. *
  209. * @return View
  210. */
  211. public function finish(): View
  212. {
  213. return view('install/finish');
  214. }
  215.  
  216. /**
  217. * Parse PHP modules
  218. *
  219. * @return array
  220. */
  221. private static function parsePhpModules(): array
  222. {
  223. ob_start();
  224. phpinfo(INFO_MODULES);
  225. $s = ob_get_clean();
  226. $s = strip_tags($s, '<h2><th><td>');
  227. $s = preg_replace('/<th[^>]*>([^<]+)<\/th>/', "<info>\\1</info>", $s);
  228. $s = preg_replace('/<td[^>]*>([^<]+)<\/td>/', "<info>\\1</info>", $s);
  229. $vTmp = preg_split('/(<h2[^>]*>[^<]+<\/h2>)/', $s, -1, PREG_SPLIT_DELIM_CAPTURE);
  230. $vModules = [];
  231. $iMax = count($vTmp);
  232.  
  233. for ($i = 1; $i < $iMax; $i++) {
  234. if (preg_match('/<h2[^>]*>([^<]+)<\/h2>/', $vTmp[$i], $vMat)) {
  235. $vName = trim($vMat[1]);
  236. $vTmp2 = explode("\n", $vTmp[$i + 1]);
  237. foreach ($vTmp2 as $vOne) {
  238. $vPat = '<info>([^<]+)<\/info>';
  239. $vPat3 = "/$vPat\s*$vPat\s*$vPat/";
  240. $vPat2 = "/$vPat\s*$vPat/";
  241. if (preg_match($vPat3, $vOne, $vMat)) {
  242. $vModules[$vName][trim($vMat[1])] = [trim($vMat[2]), trim($vMat[3])];
  243. } elseif (preg_match($vPat2, $vOne, $vMat)) {
  244. $vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
  245. }
  246. }
  247. }
  248. }
  249.  
  250. return $vModules;
  251. }
  252.  
  253. /**
  254. * Get PHP module setting
  255. *
  256. * @param string $pModuleName
  257. * @param array $pSettings
  258. *
  259. * @return string
  260. */
  261. public static function getModuleSetting(string $pModuleName, array $pSettings): string
  262. {
  263. $vModules = self::parsePhpModules();
  264.  
  265. foreach ($pSettings as $pSetting) {
  266. if (isset($vModules[$pModuleName][$pSetting])) {
  267. return $vModules[$pModuleName][$pSetting];
  268. }
  269. }
  270.  
  271. return __('main.undefined');
  272. }
  273. }