Laravel 允许只能从另一条路线访问路线

Laravel allow route to be accessible only from another route

我有 /signup/select-plan 可以让用户 select 制定计划,还有 /signup/tos 可以显示服务条款。我希望 /signup/tos 只能从 /signup/select-plan 访问。因此,如果我尝试在没有 select 计划的情况下直接进入 /signup/tos,我希望它不允许。我该怎么做?

/signup/tos 的控制器中 returns tos 视图只需添加以下代码:

$referer = Request::referer();
// or
// $referer = Request::server('HTTP_REFERER');

if (strpos($referer,'signup/select-plan') !== false) {
//SHOW THE PAGE
}
else
{
dd("YOU ARE NOT ALLOWED")
}

我们在这里做的是检查 HTTP 引荐来源网址并仅在用户来自 select-plan

时才允许页面访问

在构造函数或路由中(如果您不使用构造函数),您可以使用全局助手 url() 检查前面的 URL。

public function tos() {
    if ( !request()->is('signup/tos') && url()->previous() !=  url('signup/select-plan') ) {
        return redirect()->to('/'); //Send them somewhere else
    }
}

您需要 laravel 中的会话。您可以查看以下文档以获取更多信息:Laravel Sessions

首先你需要配置你想要会话变量的时间,这样你就可以进入你的目录config/sessions.php并且你可以编辑字段'lifetime' => 120,你也可以设置expire_on_close 默认设置为 false。

现在你可以有以下路线:

Route::get('signup/select-plan', 'SignupController@selectPlan');
Route::post('signup/select-token', 'SignupController@selectToken');
Route::get('signup/tos', 'SignupController@tos');
Route::get('registered', 'SignupController@registered');

现在在你的 Signupcontroller 中你可以有这样的东西:

public function selectPlan()
{
    // return your views/form...
}

public function selectToken(Request $request)
{
    $request->session()->put('select_plan_token', 'value');
    return redirect('/signup/tos');
}

现在在 signupController tos 函数中,您可以随时检查会话值并相应地操作数据

 public function tos()
 {
     $value = $request->session()->get('select_plan_token');
     // to your manipulation or show the view.
 }

现在,如果用户已注册并且您不需要会话值,您可以通过以下方式删除:

public function registered()
{
    $request->session()->forget('select_plan_token');
    // Return welcome screen or dashboard..
}

此方法将从会话中删除数据。你可以操纵它。您将无法在 tos 函数中使用,因为您正在刷新页面并且希望数据保留。所以最好在执行最后一步或下一步时将其删除。希望这有帮助。

注意:这只是参考,请阅读文档以获取更多信息并相应地实施。