【问题标题】:Laravel allow route to be accessible only from another routeLaravel 允许路线只能从另一条路线访问
【发布时间】:2017-07-23 01:45:10
【问题描述】:

我有/signup/select-plan 让用户选择一个计划,/signup/tos 显示服务条款。我希望 /signup/tos 只能从 /signup/select-plan 访问。因此,如果我尝试直接转到/signup/tos 而不选择计划,我希望它不允许它。我该怎么办?

【问题讨论】:

  • 简单地在该控制器上添加身份验证构造函数...
  • 是否选择了选择计划,是否存储数据?
  • @NitishKumar 是的。我希望这些数据即使在 /signup/tos 上的页面刷新后仍然存在。我只希望在用户转到另一个页面时删除该数据。

标签: php laravel laravel-routing laravel-5.4


【解决方案1】:

在返回 tos 视图的/signup/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 时才允许页面访问

【讨论】:

【解决方案2】:

在构造函数或路由中(如果您没有使用构造函数),您可以使用全局帮助器 url() 检查之前的 URL。

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

【讨论】:

  • 这是否允许我在来自 /signup/select-plan 之后进行页面刷新 /signup/tos?
【解决方案3】:

您需要在 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');
}

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

 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 函数中使用,因为您正在刷新页面并且希望数据保持不变。因此,最好在执行最后一步或下一步时将其移除。希望这会有所帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2016-01-09
    • 2016-05-27
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多