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 路由回调返回控制器的主要内容,如果未能解决你的问题,请参考以下文章

为啥只有一些 laravel 路由返回模型属性?

Laravel Eloquent 分页控制页码与路由

Laravel 路由没有到达控制器

laravel 5 根据路由返回 HTML 或 JSON

Laravel 路由在 API 中不起作用,返回 404 页

Laravel 将不同的控制器赋予相同的 Get 路由