0

Я использую Laravel 5.3, в котором с помощью Auth для пользовательского контроллера. Поэтому в основном я создать Listener для Auth EventПеренаправление не работает в LogSuccessfulLogin handle в Laravel Auth

'Illuminate\Auth\Events\Login' => [ 
    'App\Listeners\LogSuccessfulLogin', 
], 

и в LogSuccessfulLoginhandle() функции перенаправления пользователя на основной из role. но моя функция перенаправления не работает. Он отображает страницу по умолчанию «\ home».

Я делюсь My Files: -

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(); 

     // 
    } 
} 

Route/web.php

<?php 
//Auth::routes(); 
Route::get('logout', function(){ 
    Auth::logout(); // logout user 
    return Redirect::to('/'); 
}); 
#Route::get('/', '[email protected]')->name('homepage'); 
Route::get('/', function() {return view('welcome');}); 

Route::group(['middleware' => ['auth', 'checkrole:Admin'],'namespace' => 'Admin','prefix' => 'admin'], function() { 
    Route::get('/123','[email protected]')->name('dashboard'); 
    #Route::get('/','[email protected]')->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"); 
     } 
    } 
} 

и это e default logincontroller of 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

возможно дубликат HTTP: //stackoverflow.com/questions/39532803/laravel-5-3-custom-path-for-post-authentication-redirect – Silwerclaw

+0

в любом случае вы ошибаетесь, чтобы вернуть объект перенаправления из Event - приложение не прослушивает, какой обработчик события возвращается. Вы можете перенаправить пользователя, возвращая только Redirect :: to() из контроллера, промежуточного программного обеспечения или обратного вызова маршрута. – Silwerclaw

+0

На самом деле я разработчик 'symfony', и недавно я работаю над Laravel. В sf мы можем перенаправить из LoginsuccessHanlder. –

ответ

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; 
    } 
} 

Вы должны определить это промежуточное программное обеспечение в приложение/Http/Kernel.php в

protected $routeMiddleware = [ 
    'custom-redirect' => \YourNamespace\PostLoginMiddleware::class 
]; 

А затем применить его на логин маршрут

/* Authentication Routes */ 
$this->get('login', 'Auth\[email protected]'); 
$this->post('login', ['middleware' => 'custom-redirect', 'uses' => 'Auth\[email protected]']); 
$this->get('logout', 'Auth\[email protected]'); 
+0

спасибо за ваш ответ, у меня есть путаница, связанная с 'customRedirectResponse', так что вы можете объяснить немного больше. Как здесь, мне нужно поставить URL-адрес перенаправления маршрутизации или любую другую вещь. –

+0

вам нужно вставить туда то, что вы написали в обработчике событий. – Silwerclaw

+0

Хорошо, я понял. Таким образом, в целом весь код моего прослушивателя событий будет там. –