Laravel 5:重定向困境

Jas*_*enX 8 laravel

这行在routes.php中有效:

Route::get('faq', 'HomeController@faq');
Run Code Online (Sandbox Code Playgroud)

所以我将其注释掉并尝试这样:当用户登录时不起作用.它不会重定向到上述代码中的控制器操作:

Route::get('faq', function()
{
    if (Auth::check())
    {
        return redirect()->action('HomeController@faq');
    }
    else
    {
        return Redirect::to('/');
    }
});
Run Code Online (Sandbox Code Playgroud)

错误:

New exception in xxxx.xx
InvalidArgumentException · GET /faq
Action App\Http\Controllers\HomeController@faq not defined.
Run Code Online (Sandbox Code Playgroud)

但控制器和方法显然在那里.显然我做错了什么.

Lau*_*nce 6

您正尝试在路由定义本身中路由某些内容.这不是它的工作原理.

有几种方法可以做你想要达到的目标.每个人都有利弊 - 但他们都会工作.

通常,最好的方法是在路线上使用一些Auth中间件.Laravel 5 开箱即用:

Route::group(['middleware' => 'auth'], function () {
    Route::get('faq', 'HomeController@faq');
});
Run Code Online (Sandbox Code Playgroud)

因此用户必须登录才能访问常见问题解答.

另一种选择是做控制器中间件:

Route::get('faq', 'HomeController@faq');
Run Code Online (Sandbox Code Playgroud)

然后在你的HomeController中:

class HomeController extends Controller
{
    public function __construct()
    {   
        $this->middleware('auth', ['only' => ['faq']]);
    }

    public function faq()
    {    
        // Only logged in users can see this
    }
}
Run Code Online (Sandbox Code Playgroud)