Пользователь auth возвращает null в методе перенаправления - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь перенаправить пользователей на определенные маршруты в зависимости от ролей пользователей, однако auth()->user() возвращает ноль.Это аутентификация с использованием laravel 5.8.Может кто-нибудь объяснить, что происходит? Я новичок в php и laravel.

Если у вас есть ресурсы, которые подробно описывают эти процессы аутентификации, пожалуйста, поделитесь

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

use Illuminate\Http\Request;

class RegisterController extends Controller
{

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    //public $redirectTo = '/home';
    protected function redirectTo()
    {
        $role = auth()->user()->role;
        //dd($role);
        if ($role === 'candidate') {
            return '/candidate-register';
        }else if ($role === 'employer') {
            return '/employer_dashboard';
        }else if ($role === 'contractor') {
            return '/contractor_dashboard';
        }
    }

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        try {
            return Validator::make($data, [
                'first_name' => ['required', 'string', 'max:255'],
                'last_name' => ['required', 'string', 'max:255'],
                'role' => ['required', 'string', 'max:50'],
                'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                'password' => ['required', 'string', 'min:8', 'confirmed'],
            ]);
        } catch (Illuminate\Database\QueryException  $th) {
            return back()->withError($th->getMessage())->withInput();
        }
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(Request $data)
    {
        //$this->validator($data, []);
        try {
            User::create([
                'first_name' => $data['first_name'],
                'last_name' => $data['last_name'],
                'role' => $data['role'],
                'email' => $data['email'],
                'password' => Hash::make($data['password']),
            ]);
            return $this->redirectTo();
        } catch (\Illuminate\Database\QueryException $th) {
            //dd($th->getMessage());
            return redirect('/register')->withError($th->getMessage())->withInput();
        }
    }


}

Я хочу, чтобы пользователи возвращалина путь, указанный в методе перенаправления

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Я понял это:

  1. Фасад Auth не был импортирован, поэтому он не был доступен в контроллере, следовательно, он возвратил ноль.
  2. С помощью кода, записанного в контроллере, пользователь был создан, но еще не аутентифицирован, поэтому он не может получить доступ к маршруту.

Я добавил:

  1. Фасад Auth для предоставления доступа в RegisterController
  2. Auth::login($user), поэтому пользователи аутентифицируются после регистрации

Как я уже упоминал ранее, я новичок в фреймворке и медленно изучаю документы.

См. Рабочий код ниже:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Auth;


use Illuminate\Http\Request;

class RegisterController extends Controller
{


    use RegistersUsers;


    protected function redirectTo()
    {
       if(Auth::guard()->check() === true){
        $role = auth()->user()->role;

        if ($role === 'candidate') {
            return redirect('candidate-register');
        }else if ($role === 'employer') {
            return redirect('employer-register');
        }else if ($role === 'contractor') {
            return redirect('contractor-register');
        }
       }
        return redirect('register');;
    }

    public function __construct()
    {
        $this->middleware('guest');
    }


    protected function create(Request $data)
    {
        try {

            $this->validate($data, [
                'first_name' => ['required', 'string', 'max:255'],
                'last_name' => ['required', 'string', 'max:255'],
                'role' => ['required', 'string', 'max:50'],
                'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                'password' => ['required', 'string', 'min:8', 'confirmed'],
            ]);


            $user = User::create([
                'first_name' => $data['first_name'],
                'last_name' => $data['last_name'],
                'role' => $data['role'],
                'email' => $data['email'],
                'password' => Hash::make($data['password']),
            ]);
            Auth::login($user);
            return $this->redirectTo();
        } catch (\Illuminate\Database\QueryException $th) {
            return redirect('register')->withError($th->getMessage())->withInput();
        }
    }
}

0 голосов
/ 17 июня 2019

Просто сделайте это,

protected function redirectTo()
{
        if (Auth::guard()->check() === true) {
            $role = auth()->user()->role;
            if ($role === 'candidate') {
                return '/candidate';
            }else if ($role === 'employer') {
                return '/employer';
            }else if ($role === 'contractor') {
                return '/contractor';
            }
        }
        return '/';
}
protected function create(array $data)
{
   $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'role'  => $data['role'],
            'password' => Hash::make($data['password']),
        ]);
   return $user;
}

Это мой web \ route.php файл, который я тестировал с этими маршрутами

Auth::routes();

Route::group([
    'middleware' => 'auth',
    'prefix'     => 'employer'
],function(){
    Route::get('/','HomeController@employerDashboard')->name('employer');
    //......Other routes having employer prefix in the url
});

Route::group([
    'middleware' => 'auth',
    'prefix'     => 'candidate'
],function(){
    Route::get('/','HomeController@candidateDashboard')->name('candidate');
    //......Other routes having employer prefix in the url
});

Route::group([
    'middleware' => 'auth',
    'prefix'     => 'contractor'
],function(){
    Route::get('/','HomeController@contractorDashboard')->name('contractor');
    //......Other routes having contractor prefix in the url
});
...