路径[登录]未定义

ink*_*nkd 42 php laravel

今天第一次尝试与Laravel一起玩.当我尝试访问localhost/project/public时出现以下错误:

InvalidArgumentException
未定义Route [login].

应用程序/ routes.php文件:

<?php

Route::get('/', 'HomeController@redirect');
Route::get('login', 'LoginController@show');
Route::post('login', 'LoginController@do');
Route::get('dashboard', 'DashboardController@show');
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ HomeController.php:

<?php

class HomeController extends Controller {

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

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

}
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ 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
    }

}
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ DashboardController.php:

<?php

class DashboardController extends Controller {

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

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

}
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?

Jef*_*ert 70

您正在尝试重定向到名称为的命名路由login,但您没有具有该名称的路由:

Route::post('login', [ 'as' => 'login', 'uses' => 'LoginController@do']);
Run Code Online (Sandbox Code Playgroud)

'as'第二个参数的部分定义了路径的名称.第一个字符串参数定义它的路由.

  • 不会`Route :: post('login','LoginController @ do') - > name('login');`工作相同,读一点清洁? (7认同)

ais*_*tes 38

在app\Exceptions\Handler.php中

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

    return redirect()->guest(route('auth.login'));
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但遗憾的是Laravel编写了这条路线(对新手来说并不明显) (6认同)
  • 不要忘记将其添加到文件的顶部:`use Illuminate \ Auth \ AuthenticationException;`。 (3认同)
  • 非常感谢你做的这些。 (2认同)

小智 11

Laravel 在Laravel 4.2中引入了Named Routes.

什么是命名路线?

命名路由允许您为路由器路径指定名称.因此,使用名称我们可以在所需文件中调用路由.


如何创建命名路线?

命名路由以两种不同的方式创建:asname()

方法1:

Route::get('about',array('as'=>'about-as',function()
    {
            return view('about');
     }
));
Run Code Online (Sandbox Code Playgroud)

方法2:

 Route::get('about',function()
{
 return view('about');
})->name('about-as');
Run Code Online (Sandbox Code Playgroud)

我们如何在视图中使用?

<a href="{{ URL::route("about-as") }}">about-as</a>
Run Code Online (Sandbox Code Playgroud)

因此,如果用户尚未登录,laravel'middleware '=>'auth'已经预定义为重定向作为登录页面.因此我们应该使用as关键字

    Route::get('login',array('as'=>'login',function(){
    return view('login');
}));
Run Code Online (Sandbox Code Playgroud)


Dib*_*Roy 11

您需要将以下行添加到web.php路由文件中:

Auth::routes();
Run Code Online (Sandbox Code Playgroud)

如果您有自定义身份验证路由,请确保/ login路由具有'as'=>'login'


Nir*_*vda 7

在 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'));
}
Run Code Online (Sandbox Code Playgroud)

  • 对于发现此解决方案相关的其他人...确保您发送的是`Accept: application/json` 标头。这将确保您获得 JSON + HTTP 401 响应(如预期)。如果您不发送该标头,Laravel 将尝试将您发送到 `/login` 路由(并且您将遇到与 OP 相同的问题)。 (6认同)

小智 7

尝试在请求的标头处添加:Accept = application / json 邮递员添加标头

  • 这才是真正的答案。 (8认同)
  • 这*不是*答案。这就是如何绕过这个问题。即使您应该在正常使用下提供标头,应用程序也应该使用比 500 个响应代码更好的内容来处理此用例。 (3认同)
  • 我收到的消息是“未经身份验证”。为什么会这样? (2认同)

Cen*_*ael 6

聚会迟到了。如果您的期望是返回某种 json 而不是重定向,则编辑异常处理程序,这样做即可。

转到App\Exceptions\Handler.php 然后编辑此代码:

public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }
Run Code Online (Sandbox Code Playgroud)

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


clo*_*e45 5

我最近在使用 Laravel 的内置身份验证路由后遇到了这个错误php artisan make:auth。当您运行该命令时,这些新路由将添加到您的 web.php 文件中:

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Run Code Online (Sandbox Code Playgroud)

我一定是不小心删除了这些路线。再次运行,php artisan make:auth路线恢复,问题解决。我正在运行 Laravel 5.5.28。


小智 5

Route::get('/login', function () {
return view('login');})->name('login');
Run Code Online (Sandbox Code Playgroud)

如果使用您自己的自定义身份验证系统,请命名您的登录路径。