Маршрут [логин] не определен

Попытка играть с Laravel сегодня в первый раз. Я получаю следующую ошибку при попытке посетить localhost/project/public:

InvalidArgumentException
Маршрут [логин] не определен.

Приложение/routes.php:

<?php

Route::get('/', '[email protected]');
Route::get('login', '[email protected]');
Route::post('login', '[email protected]');
Route::get('dashboard', '[email protected]');

приложение/контроллеры/HomeController.php:

<?php

class HomeController extends Controller {

    public function redirect()
    {
        if (Auth::check()) 
            return Redirect::route('dashboard');

        return Redirect::route('login');
    }

}

приложение/контроллеры/LoginContoller.php:

<?php

class LoginController extends Controller {

    public function show()
    {
        if (Auth::check()) 
            return Redirect::route('dashboard');

        return View::make('login');
    }

    public function do()
    {
        // do login
    }

}

приложение/контроллеры/DashboardController.php:

<?php

class DashboardController extends Controller {

    public function show()
    {
        if (Auth::guest()) 
            return Redirect::route('login');

        return View::make('dashboard');
    }

}

Почему я получаю эту ошибку?

Ответы

Ответ 1

Вы пытаетесь перенаправить на именованный маршрут, имя которого - login, но у вас нет маршрутов с таким именем:

Route::post('login', [ 'as' => 'login', 'uses' => '[email protected]']);

Часть 'as' второго параметра определяет название маршрута. Первый строковый параметр определяет его маршрут.

Ответ 2

В приложении \Exceptions\Handler.php

protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('auth.login'));
}

Ответ 3

Laravel представил именованные маршруты в Laravel 4.2.

ЧТО ТАКОЕ ИМЕННЫЕ МАРШРУТЫ?

Именованные маршруты позволяют вам давать имена вашему пути к маршрутизатору. Следовательно, используя имя, мы можем назвать маршруты в требуемом файле.


КАК СОЗДАТЬ ИМЕННЫЕ МАРШРУТЫ?

Именованные маршруты создаются двумя разными способами: as и name()

МЕТОД 1:

Route::get('about',array('as'=>'about-as',function()
    {
            return view('about');
     }
));

МЕТОД 2:

 Route::get('about',function()
{
 return view('about');
})->name('about-as');

Как мы используем в представлениях?

<a href="{{ URL::route("about-as") }}">about-as</a>

Следовательно, laravel 'middleware' => 'auth' уже предопределен для перенаправления в качестве страницы входа, если пользователь еще не вошел в систему. Поэтому мы должны использовать в качестве ключевого слова

    Route::get('login',array('as'=>'login',function(){
    return view('login');
}));

Ответ 4

Вам нужно добавить следующую строку в ваш файл маршрутов web.php:

Auth::routes();

В случае, если у вас есть пользовательские маршруты авторизации, убедитесь, что вы/логин-маршрут имеют 'as' => 'login'

Ответ 5

В случае API или, скажем, при реализации JWT. Промежуточное программное обеспечение JWT выдает это исключение, когда оно не может найти токен и пытается перенаправить его в журнал на маршруте. Поскольку он не может найти ни одного журнала в указанном маршруте, он выдает это исключение. Вы можете изменить маршрут в "app\Exceptions\Handler.php"

использовать Illuminate\Auth\AuthenticationException;

protected function unauthenticated($request, AuthenticationException $exception){
        return $request->expectsJson()
             ? response()->json(['message' => $exception->getMessage()], 401)
            : redirect()->guest(route('ROUTENAME'));
}

Ответ 6

Попробуйте этот метод:

найдите этот файл

"RedirectifAuthenticated.php"

обновите следующее, как вы предпочитаете

 if (Auth::guard($guard)->check()) {
   return redirect('/');
 }

$guard, так как arg примет имя настраиваемого защитного устройства, которое вы установили, например. "admin", тогда это должно быть так.

if (Auth::guard('admin')->check()) {
  return redirect('/admin/dashboard');
}else{
  return redirect('/admin/login');
}

Ответ 7

Недавно я столкнулся с этой ошибкой после использования встроенной маршрутизации аутентификации Laravel с помощью php artisan make:auth. Когда вы запустите эту команду, эти новые маршруты добавляются в ваш файл web.php:

Auth::routes();

Route::get('/home', '[email protected]')->name('home');

Я, должно быть, случайно удалил эти маршруты. Выполнение php artisan make:auth снова восстановило маршруты и решило проблему. Я запускаю Laravel 5.5.28.

Ответ 9

Замените в своих представлениях (файлы лезвий) все

{{ маршрут ('/')}} ----- by ---- > {{ url ('/')}}

Ответ 10

Я опоздал на вечеринку. если вы ожидаете, что какой-то json вернется не перенаправленным, то отредактируйте обработчик исключений, так что просто сделайте это.

Перейдите в App\Exceptions\Handler.php Затем отредактируйте этот код:

public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }

в

public function render($request, Exception $exception)
    {
        return response()->json(
            [
                'errors' => [
                    'status' => 401,
                    'message' => 'Unauthenticated',
                ]
            ], 401
        );
    }

Ответ 11

Если кто-то получает это от отдыхающего клиента (например, Почтальон) - Вам нужно установить в Заголовке значение Accept application/json.

Чтобы сделать это на почтальоне, нажмите на вкладку "Заголовки", добавьте новый ключ "Принять" и введите значение "application/json".

Ответ 12

Route::post('login', '[email protected]')->name('login')

работает очень хорошо, и это чисто и говорит само за себя

Ответ 13

Laravel ^ 5.7

Аутентификация промежуточного программного обеспечения

Laravel ^ 5.7 включает в себя новое промежуточное ПО для обработки и перенаправления неаутентифицированных пользователей.

Он хорошо работает с "web" guard... конечно, маршрут " login " (или как вы его называете), должен быть определен в web.php.

проблема в том, когда вы используете пользовательские охранник. Разные охранники перенаправляют неаутентифицированных пользователей на другой маршрут.

здесь быстрый обходной путь, основанный на ответе Джона (он работает для меня).


app/http/Middleware/Authenticate.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * @var array
     */
    protected $guards = [];




    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string[]  ...$guards
     * @return mixed
     *
     * @throws \Illuminate\Auth\AuthenticationException
     */
    public function handle($request, Closure $next, ...$guards)
    {
        $this->guards = $guards;

        return parent::handle($request, $next, ...$guards);
    }




    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {

            if (in_array('admin', $this->guards)) {

                return route('admin.login');
            }

            return route('login');
        }
    }
}

Источник: выпуск № 26292

Ответ 14

Решение простое!

перейти к файлу: config/auth.php

идентифицировать этот блок кода:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

и изменить на:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],