laravel 路由回调返回控制器
Posted
技术标签:
【中文标题】laravel 路由回调返回控制器【英文标题】:laravel route callback return controller 【发布时间】:2021-07-11 02:10:06 【问题描述】:你好,我是 laravel 的新手,也许这对你们来说很愚蠢。 在 laravel 8 路由 web.php 我创建了这样的路由:
Route::get('/', function ()
return view('login');
);
Route::post('/auth', 'App\Http\Controllers\SiteController@auth');
Route::get('/home', function ()
if (session()->has('username')) return view('home');
else return redirect('/');
);
Route::post('/editprofile', 'App\Http\Controllers\SiteController@edit_profile');
我想问的是,我们也可以从类似视图的回调中返回控制器吗?假设我想在用户编辑他的个人资料时检查会话。所以在路由/editprofile中,第二个参数不是'App\Http\Controllers\SiteController@edit_profile',而是像路由'/home'这样的回调函数。像这样:
Route::post('/home', function ()
if (session()->has('username')) return controller('App\Http\Controllers\SiteController@edit_profile');
else return redirect('/');
);
但它返回错误哈哈。假设我不想使用 __construct 方法来检查会话。可能吗?提前致谢
【问题讨论】:
【参考方案1】:第一件事,
因为你是从 if 语句中返回的,所以不需要 else
这个
Route::get('/home', function ()
if (session()->has('username')) return view('home');
else return redirect('/');
);
应该是这样的;
Route::get('/home', function ()
if (session()->has('username'))
return view('home');
return redirect('/');
);
其次,不要担心路由内部的所有内容,只需将其传递给您的控制器,然后在其上添加路由中间件即可。以下是基本的身份验证中间件,但您也可以创建自己的
use App\Http\Controllers\UserController;
Route::get('/home', [HomeController::class, 'index'])->middleware('auth');
您可以在此处阅读有关中间件的更多信息 https://laravel.com/docs/8.x/middleware
【讨论】:
感谢 if 语句的改进。所以基本上没有使用简单 if 的控制器返回的回调?我们必须使用中间件吗? 您可以使用return Redirect::action('HomeController@index');
,但您应该将所有此类逻辑保留在中间件中。它将使项目保持整洁并让您习惯使用它们。更不用说路由内部的闭包会阻止它们被缓存。以上是关于laravel 路由回调返回控制器的主要内容,如果未能解决你的问题,请参考以下文章