Почему middleware блокирует страницы?
Использую вполне стандартный функционал. Использую два middleware по умолчанию: auth и guest. В файле app\Http\Kernel.php прописаны следующие строки:
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
...
];
Создал два контроллера для авторизации и регистрации: LoginController и RegisterController. В LoginController в конструкторе пишу такой код:
class LoginController extends Controller
{
public function __construct() {
$this->middleware('guest')->except('logout');
}
//Форма входа
public function login() {
return view('auth.login');
}
...
В контроллере RegisterController пишу:
// Контроллер регистрации пользователя
class RegisterController extends Controller
{
public function __construct() {
$this->middleware('guest');
}
// Форма регистрации
public function register() {
return view('auth.register');
}
...
В route/web.php пишу такой код:
Route::group([
'as' => 'auth.', // имя маршрута, например auth.index
'prefix' => 'auth', // префикс маршрута, например auth/index
], function () {
// Форма регистрации
Route::get('register', [RegisterController::class, 'register'])->name('register');
// Создание пользователя
Route::post('register', [RegisterController::class, 'create'])->name('create');
//Форма входа
Route::get('login', [LoginController::class, 'login'])->name('login');
// аутентификация
Route::post('login', [LoginController::class, 'autenticate'])->name('auth');
// выход
Route::get('logout', [LoginController::class, 'logout'])->name('logout');
});
Когда перехожу по адресу "сайт\public\auth\register" или "сайт\public\auth\login" ругается на несуществующую страницу. Почему так происходит? Кстати до этого все работало, а потом перестало. Когда закомментировал код в конструкторах RegisterController и LoginController на вышеупомянутые страницы стало переходить успешно, но при успешной авторизации юзер все равно видит контент страницы авторизации и регистрации. Как исправить ошибку?
Ответы (1 шт):
Если кому интересно. Все заработало. В \App\Http\Middleware\Authenticate прописываем следующее:
class Authenticate extends Middleware
{
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('auth.login');
}
}
}
А в файле App\Http\Middleware\RedirectIfAuthenticated также переопределяем роут.
public function handle(Request $request, Closure $next, ...$guards)
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return redirect()->route('user.index');
}
}
return $next($request);
}