laravel
访问需要登陆的页面,如果当前未登陆,出现如下错误:
Route [login] not defined.
起初以为是auth中间件使用过程中哪儿出错了,最后找到错误提示的原因
错误原因:
我们通过错误提示排查错误出现的原因:
1、在vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
文件中,我们可以看到未登录用户跳转:redirect()->guest(route(‘login’)
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest(route('login'));
}
2、在vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php
文件里route方法中发现$this->routes->getByName($name)通过路由名查找路由。
public function route($name, $parameters = [], $absolute = true)
{
if (! is_null($route = $this->routes->getByName($name))) {
return $this->toRoute($route, $parameters, $absolute);
}
throw new RouteNotFoundException("Route [{$name}] not defined.");
}
通过以上两个地方,我们发现$this->routes->getByName($name)这儿是导致错误的关键点。原来是我们定义路由时并未定义路由名(name),因而出现如题错误。
解决办法:
1、方法一:修改项目源码
找到项目源码vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
修改如下方法中route('login')
的地址:
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect()->guest(route('login'));
}
或者修改为如下跳转方式:
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson() ? response()->json(['message' => $exception->getMessage()], 401) : redirect('admin/login');
}
2、方法二:增加login路由
在web.php
中给你的Login
登录路由设置login
名字:
Route::group(['prefix' => 'admin'], function () {
Route::get('/login', '\App\Http\Controllers\Admin\LoginController@index')->name('login');
Route::post('/login', '\App\Http\Controllers\Admin\LoginController@login');
Route::get('/logout', '\App\Http\Controllers\Admin\LoginController@logout')->name('logout');
Route::group(['middleware' => 'auth:admin'], function () {
// 后台首页
Route::get('/home', '\App\Http\Controllers\Admin\HomeController@index');
});
});