Вход Регистрация
Файл: app/Http/Controllers/InstallController.php
Строк: 190
<?php

declare(strict_types=1);

namespace 
AppHttpControllers;

use 
AppClassesValidator;
use 
AppModelsNews;
use 
AppModelsSetting;
use 
AppModelsUser;
use 
IlluminateHttpRedirectResponse;
use 
IlluminateHttpRequest;
use 
IlluminateSupportFacadesArtisan;
use 
IlluminateSupportFacadesLang;
use 
IlluminateSupportFacadesSchema;
use 
IlluminateViewView;

class 
InstallController extends Controller
{
    
/**
     * Конструктор
     */
    
public function __construct(Request $request)
    {
        
$lang = $request->input('lang', 'ru');

        
Lang::setLocale($lang);

        
view()->share('lang', $lang);
    }

    
/**
     * Главная страница
     */
    
public function index(): View
    
{
        
$keys = [
            
'APP_ENV',
            
'APP_DEBUG',
            
'DB_CONNECTION',
            
'DB_HOST',
            
'DB_PORT',
            
'DB_DATABASE',
            
'DB_USERNAME',
            
'APP_URL',
            
'APP_EMAIL',
            
'APP_ADMIN',
        ];

        
$versions = [
            
'php'   => '8.1.0',
            
'mysql' => '5.7.8',
            
'maria' => '10.2.7',
            
'pgsql' => '9.2',
        ];

        
$storage = glob(storage_path('{*,*/*,*/*/*}'), GLOB_BRACE | GLOB_ONLYDIR);
        
$uploads = glob(public_path('uploads/*'), GLOB_ONLYDIR);
        
$dirs = [public_path('assets/modules'), base_path('bootstrap/cache')];

        
$dirs = array_merge($storage, $uploads, $dirs);
        
$languages = array_map('basename', glob(resource_path('lang/*'), GLOB_ONLYDIR));

        return 
view('install/index', compact('keys', 'languages', 'versions', 'dirs'));
    }

    
/**
     * Проверка статуса
     */
    
public function status(): View
    
{
        if (! 
Schema::hasTable('migrations')) {
            
Artisan::call('migrate:install');
        }

        
Artisan::call('migrate:status');
        
$output = Artisan::output();

        return 
view('install/status', compact('output'));
    }

    
/**
     * Выполнение миграций
     */
    
public function migrate(): View
    
{
        
Artisan::call('migrate', ['--force' => true]);
        
$output = Artisan::output();

        if (! 
setting('app_installed')) {
            
Artisan::call('key:generate', ['--force' => true]);
        }

        
Artisan::call('cache:clear');
        
Artisan::call('route:clear');
        
Artisan::call('config:clear');

        return 
view('install/migrate', compact('output'));
    }

    
/**
     * Заполнение БД
     */
    
public function seed(): View
    
{
        
Artisan::call('db:seed', ['--force' => true]);
        
$output = Artisan::output();

        
Artisan::call('cache:clear');
        
Artisan::call('route:clear');
        
Artisan::call('config:clear');

        return 
view('install/seed', compact('output'));
    }

    
/**
     * Создание администратора
     *
     *
     * @return View|RedirectResponse
     */
    
public function account(Request $request, Validator $validator)
    {
        
$lang = $request->input('lang', 'ru');
        
$login = $request->input('login');
        
$password = $request->input('password');
        
$password2 = $request->input('password2');
        
$email = strtolower((string) $request->input('email'));

        if (
$request->isMethod('post')) {
            
$validator->regex($login, '|^[a-z0-9-]+$|i', ['login' => __('validator.login')])
                ->
regex(utfSubstr($login, 0, 1), '|^[a-z0-9]+$|i', ['login' => __('users.login_begin_requirements')])
                ->
email($email, ['email' => __('validator.email')])
                ->
length($login, 3, 20, ['login' => __('users.login_length_requirements')])
                ->
length($password, 6, 20, ['password' => __('users.password_length_requirements')])
                ->
equal($password, $password2, ['password2' => __('users.passwords_different')])
                ->
false(ctype_digit($login), ['login' => __('users.field_characters_requirements')])
                ->
false(ctype_digit($password), ['password' => __('users.field_characters_requirements')])
                ->
false(substr_count($login, '-') > 2, ['login' => __('users.login_hyphens_requirements')]);

            if (
$validator->isValid()) {
                
// Проверка логина на существование
                
$checkLogin = User::query()->where('login', $login)->exists();
                
$validator->false($checkLogin, ['login' => __('users.login_already_exists')]);

                
// Проверка email на существование
                
$checkMail = User::query()->where('email', $email)->exists();
                
$validator->false($checkMail, ['email' => __('users.email_already_exists')]);
            }

            if (
$validator->isValid()) {
                
/** @var User $user */
                
$user = User::query()->create([
                    
'login'      => $login,
                    
'password'   => password_hash($password, PASSWORD_BCRYPT),
                    
'email'      => $email,
                    
'level'      => User::BOSS,
                    
'gender'     => User::MALE,
                    
'themes'     => 'default',
                    
'point'      => 500,
                    
'money'      => 100000,
                    
'status'     => 'Boss',
                    
'language'   => $lang,
                    
'created_at' => SITETIME,
                ]);

                
// ------------- Авторизация -----------//
                
User::auth($login, $password);

                
// -------------- Приват ---------------//
                
$text = __('install.text_message', ['login' => $login]);
                
$user->sendMessage(null, $text);

                
// -------------- Новость ---------------//
                
$textnews = __('install.text_news');

                
News::query()->create([
                    
'title'      => __('install.welcome'),
                    
'text'       => $textnews,
                    
'user_id'    => $user->id,
                    
'created_at' => SITETIME,
                ]);

                
clearCache(['statNews', 'lastNews', 'statNewsDate', 'NewsFeed']);

                return 
redirect('/install/finish');
            }

            
setInput($request->all());
            
setFlash('danger', $validator->getErrors());
        }

        return 
view('install/account', compact('login', 'email'));
    }

    
/**
     * Завершение установки
     */
    
public function finish(): View
    
{
        
// -------------- Установка -------------//
        
Setting::query()
            ->
where('name', 'app_installed')
            ->
update([
                
'value' => 1,
            ]);

        
clearCache('settings');

        return 
view('install/finish');
    }

    
/**
     * Parse PHP modules
     */
    
private static function parsePhpModules(): array
    {
        
ob_start();
        
phpinfo(INFO_MODULES);
        
$s = ob_get_clean();
        
$s = strip_tags($s, '<h2><th><td>');
        
$s = preg_replace('/<th[^>]*>([^<]+)</th>/', '<info>\1</info>', $s);
        
$s = preg_replace('/<td[^>]*>([^<]+)</td>/', '<info>\1</info>', $s);
        
$vTmp = preg_split('/(<h2[^>]*>[^<]+</h2>)/', $s, -1, PREG_SPLIT_DELIM_CAPTURE);
        
$vModules = [];
        
$iMax = count($vTmp);

        for (
$i = 1; $i < $iMax; $i++) {
            if (
preg_match('/<h2[^>]*>([^<]+)</h2>/', $vTmp[$i], $vMat)) {
                
$vName = trim($vMat[1]);
                
$vTmp2 = explode("n", $vTmp[$i + 1]);
                foreach (
$vTmp2 as $vOne) {
                    
$vPat = '<info>([^<]+)</info>';
                    
$vPat3 = "/$vPats*$vPats*$vPat/";
                    
$vPat2 = "/$vPats*$vPat/";
                    if (
preg_match($vPat3, $vOne, $vMat)) {
                        
$vModules[$vName][trim($vMat[1])] = [trim($vMat[2]), trim($vMat[3])];
                    } elseif (
preg_match($vPat2, $vOne, $vMat)) {
                        
$vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
                    }
                }
            }
        }

        return 
$vModules;
    }

    
/**
     * Get PHP module setting
     */
    
public static function getModuleSetting(string $pModuleName, array $pSettings): string
    
{
        
$vModules = self::parsePhpModules();

        foreach (
$pSettings as $pSetting) {
            if (isset(
$vModules[$pModuleName][$pSetting])) {
                return 
$vModules[$pModuleName][$pSetting];
            }
        }

        return 
__('main.undefined');
    }
}
Онлайн: 0
Реклама