Laravel 7.15 同一路由/区分登录与游客对应不同控制器问题
解决Laravel 7.15中根路由根据登录状态对应不同控制器的问题
你的问题出在路由注册的时机上!当Laravel启动应用并加载路由时,auth()->user()会返回null——因为这时候还没有处理任何用户请求,认证系统还没初始化当前用户的会话。所以你的$uses变量只会被设置一次,永远是BlogController@index,不管后续用户是否登录。
下面给你几种可行的解决方案:
方案1:使用闭包路由(简单直接)
在路由中用闭包处理请求时的用户状态判断,这样判断逻辑会在每次请求时执行,而不是路由注册时:
Route::get('/', function () { if (auth()->check()) { // 已登录用户,调用HomeController的index方法 return app()->make(App\Http\Controllers\HomeController::class)->index(); } else { // 游客用户,调用BlogController的index方法 return app()->make(App\Http\Controllers\BlogController::class)->index(); } });
或者用更简洁的action辅助函数:
Route::get('/', function () { $action = auth()->check() ? 'HomeController@index' : 'BlogController@index'; return action($action); });
方案2:使用中间控制器(支持路由缓存)
如果你的项目需要启用路由缓存(php artisan route:cache),闭包路由无法被缓存,这时候推荐用一个中间控制器来转发请求:
- 首先创建一个
IndexController:
<?php namespace App\Http\Controllers; use App\Http\Controllers\HomeController; use App\Http\Controllers\BlogController; class IndexController extends Controller { public function handle() { if (auth()->check()) { return (new HomeController())->index(); } else { return (new BlogController())->index(); } } }
- 然后在路由中指向这个控制器的方法:
Route::get('/', 'IndexController@handle');
这种方式的好处是可以正常使用路由缓存,适合生产环境。
方案3:使用路由中间件(灵活扩展)
你也可以自定义一个中间件来处理路由转发:
- 创建中间件:
php artisan make:middleware RedirectBasedOnAuth
- 在中间件的
handle方法中添加逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class RedirectBasedOnAuth { public function handle($request, Closure $next) { // 保持根路由URL不变,直接渲染对应控制器的视图 if (Auth::check()) { return app()->make(\App\Http\Controllers\HomeController::class)->index(); } else { return app()->make(\App\Http\Controllers\BlogController::class)->index(); } // 如果需要跳转到对应控制器的路由(URL会变化),可以用下面的代码: // if (Auth::check()) { // return redirect()->action('HomeController@index'); // } else { // return redirect()->action('BlogController@index'); // } } }
- 在
app/Http/Kernel.php中注册中间件,然后在路由中使用:
Route::get('/', function () { // 这里的内容会被中间件处理 })->middleware('redirectBasedOnAuth');
这个方案适合需要在多个路由中复用该逻辑的场景。
内容的提问来源于stack exchange,提问作者Obinna Iloeje
相关产品推荐
相关产品推荐

