HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/csb.komma.pro/app/Auth/RegisterController.php
<?php

namespace App\Auth;

use App\Addresses\Models\Address;
use App\Auth\Rules\GuestOrNxUser;
use App\Base\Controller;
use App\Users\Models\SiteUser;
use App\Users\Models\SiteUserRole;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Komma\KMS\Auth\AuthMailServiceInterface;
use Komma\KMS\Globalization\Language;
use Komma\KMS\Globalization\RegionInfo;

final class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/registered';

    /** @var AuthMailServiceInterface $authMailService */
    private $authMailService;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
        $this->authMailService = app(AuthMailServiceInterface::class);
        parent::__construct();
    }

    /**
     * Show the application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showRegistrationForm()
    {
        $culturesForSelect = RegionInfo::getNeutralCultures()->map(function(RegionInfo $regionInfo) {
            return [$regionInfo->getThreeLetterISORegionName() => $regionInfo->getNativeName() ? $regionInfo->getNativeName() : $regionInfo->getDisplayName()];
        })->collapse()->sort()->toArray();


        $neutralCulturesHotList = RegionInfo::getNeutralCultures()->filter(function(RegionInfo $regionInfo) {
            return in_array($regionInfo->getThreeLetterISORegionName(), config('shop.country_hotlist', []), true);
        })->map(function(RegionInfo $regionInfo) use(&$culturesForSelect) {
            if(isset($culturesForSelect[$regionInfo->getThreeLetterISORegionName()])) unset($culturesForSelect[$regionInfo->getThreeLetterISORegionName()]); //Remove the item from the regular cultures list
            return [$regionInfo->getThreeLetterISORegionName() => $regionInfo->getNativeName() !== '' ? $regionInfo->getNativeName() : $regionInfo->getDisplayName()];
        })->collapse()->sort();

        return view('templates.auth.register', ['links' => $this->links, 'cultures' => $culturesForSelect, 'culturesHotlist' => $neutralCulturesHotList]);
    }

    /**
     * Show the application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showRegistered()
    {
        return view('templates.auth.registered', ['links' => $this->links]);
    }


    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'first_name' => 'required|max:255',
            'last_name' => 'required|max:255',
            'country' => ['required'],
            'language' => ['required'],
            'email' => ['required', 'email', 'max:255', new GuestOrNxUser()],
            'accept_legal' => 'accepted'
        ]);
    }

    /**
     * Handle a registration request for the application.
     *
     * @param Request $request
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    {
        $this->validator($request->all())->validate();

        event(new Registered($user = $this->create($request->all())));

//        $this->guard()->login($user);

        return $this->registered($request, $user)
            ?: redirect($this->redirectPath());
    }

    /**
     * Create a new site user instance after a valid registration.
     *
     * @param  array $data
     * @return SiteUser
     */
    protected function create(array $data)
    {
        //Use the users language and country to build a culture string.
        /** @var RegionInfo|null $usersRegionInfo */
        $usersRegionInfo = null;
        RegionInfo::getWhere('threeLetterISORegionName', '=', $data['country'])->each(function(RegionInfo $regionInfo) use($data, &$usersRegionInfo) {
            $regionCode = $regionInfo->getName();
            $languageCode = null;
            $regionInfo->getLanguages()->each(function(Language $language) use($data, &$languageCode) {
                if($language->getThreeLetterISOLanguageName() == $data['language']) {
                    $languageCode = $language->getName();
                    return false; //break
                }
            });
            if($regionCode && $languageCode) {
                $regionInfoString = implode('-', [$languageCode, $regionCode]);
                $usersRegionInfo = RegionInfo::getInstance($regionInfoString);
                return false; //break;
            }
        });

        //This trick also gets guest users and transforms them into registered ones.
        /** @var SiteUser $newUser */
        $newUser = SiteUser::firstOrCreate([
            'email' => $data['email'],
        ]);
        $newUser->culture = $usersRegionInfo->getName();

        $usersRegionInfo = RegionInfo::getInstance($newUser->culture);
        $address = Address::firstOrCreate([
            'street'        => $data['street'],
            'house_number'  => $data['house_number'],
            'postal_code'   => $data['postal_code'],
            'city'          => $data['city'],
            'telephone'     => $data['phone'],
            'country_iso3'  => $data['country'],
        ]);

        $newUser->role = SiteUserRole::Customer;
        $newUser->first_name = $data['first_name'];
        $newUser->last_name = $data['last_name'];
        $newUser->telephone = $data['phone'];
        $newUser->gender = $data['gender'];
        $newUser->password = \Hash::make($data['password']);
        $newUser->guest = false;
        $newUser->save();
        $newUser->addresses()->save($address);

        $this->authMailService->notifyAdminsForNewCustomer($newUser);
        $this->authMailService->notifyUserToSetPassword($newUser);

        return $newUser;
    }

    /**
     * Get the guard to be used during registration.
     *
     * @return \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected function guard()
    {
        return Auth::guard('site');
    }
}