我正在使用Laravel 5.3
,其中Auth
用于用户控制器。
所以基本上我为Listener
事件
Auth
'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogSuccessfulLogin',
],
并在LogSuccessfulLogin
handle()
功能重定向用户基于role
。但我的重定向功能不起作用。它呈现默认页面'\ home'路线。
我正在分享我的档案: -
EventServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\SomeEvent' => [
'App\Listeners\EventListener',
],
'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogSuccessfulLogin',
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
路线/ web.php
<?php
//Auth::routes();
Route::get('logout', function(){
Auth::logout(); // logout user
return Redirect::to('/');
});
#Route::get('/', 'HomeController@index')->name('homepage');
Route::get('/', function () {return view('welcome');});
Route::group(['middleware' => ['auth', 'checkrole:Admin'],'namespace' => 'Admin','prefix' => 'admin'], function () {
Route::get('/123','DashboardController@index')->name('dashboard');
#Route::get('/','DashboardController@index')->name('dashboard');
Route::get('user/profile', function () {
// Uses Auth Middleware
});
});
这里是LogSuccessfulLogin.php
<?php
namespace App\Listeners;
use Illuminate\Auth\Events\Login;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
class LogSuccessfulLogin
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param Login $event
* @return void
*/
public function handle(Login $event)
{
$user=Auth::User()->role->role_name;
if($user=="Admin"){
return Redirect::route('dashboard');
#return redirect()->route('login');
}
elseif($user == "Employer" ){
dd("hello");
}
}
}
这是Auth
的默认登录控制器<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
}
}
如果我做错了,请告诉我。
实际上我也尝试在LogSuccessfulLogin
监听器中使用return redirect()->route('login');
重定向页面,但它也无效。
答案 0 :(得分:2)
作为可能的解决方案之一,我将提供一个响应中间件,它将附加到登录路由。收到回复后,您应检查用户是否已登录,如果是,则应用自定义重定向登录。在这种情况下,您将覆盖默认的Laravel 5.3重定向逻辑。像这样的Smth:
class PostLoginMiddleware
{
public function handle($request, Closure $next, $guard = null)
{
// here you've already have response and it's usually redirect
$response = $next($request);
// if user logged in
if (\Auth::id()) {
$customRedirectResponse = // ...apply your custom logic
return $customRedirectResponse;
}
return $response;
}
}
您应该在
中的app / Http / Kernel.php中定义此中间件protected $routeMiddleware = [
'custom-redirect' => \YourNamespace\PostLoginMiddleware::class
];
然后将其应用于登录路线
/* Authentication Routes */
$this->get('login', 'Auth\AuthController@showLoginForm');
$this->post('login', ['middleware' => 'custom-redirect', 'uses' => 'Auth\AuthController@login']);
$this->get('logout', 'Auth\AuthController@logout');