【问题标题】:Laravel: Show or hide content depending on a Session variableLaravel:根据会话变量显示或隐藏内容
【发布时间】:2019-10-01 04:52:14
【问题描述】:

我正在做一个有密码保护的视图。基本上,当您访问该资源时,您会看到一个表明您需要输入密码的视图。 正确的行为应该是

  1. 您访问视图
  2. 用户输入密码并发送 POST 表单
  3. 如果该方法以特定值重定向回来,您必须看到页面的真实内容。

所以我的刀片代码如下:

@if ($passedPassword = Session::get('passedPassword'))
    ...here goes the real/true view content
@else
    <section class="questionnaire-questions">

      <div>

        <form
          action="{{ route('questionnaire.password', ['questionnaire' => $questionnaire->id]) }}"
          method="POST">
          {{ csrf_field() }}

          <h3 class="text-center">@lang('questionnaire.password.advice')<h3>
          <div class="row">
            <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
              <div class="goal-input-group numeric">
                <label>PASSWORD</label>
                <input
                  style='visibility: visible;'
                  name="password"
                  type="password"
                >
              </div>
            </div>
          </div>

          <div class="text-center">
            <button type="submit" class="goal-btn goal-btn-lg goal-btn-artic-blue">@lang('questionnaire.password')</button>
          </div>

        </form>

      </div>

    </section>  
@endif

该视图使用以下方法呈现:

public function show(Questionnaire $questionnaire) {

    $data = [];
    $data['questionnaire'] = $questionnaire;

    \Session::flash('passedPassword', false);
    return view('questionnaires.show', array('data' => $data));

}

在前面的方法中,我传递了passedPassword,但我找不到将它作为flash 变量传递的方法。如果有办法添加像

这样的数据
    return back()->with(array(
        'passedPassword' => false
    ));

但如果使用 view 方法,我将非常感激。

然后,当用户点击按钮时,我调用下一个函数:

public function password(Request $request, Questionnaire $questionnaire) {
    if (strcmp($questionnaire->password, $request->input('password')) == 0) {
        return back()->with(array(
            'passedPassword' => false
        ));
    }
}

但即使密码正确,我也得到了密码视图,闪存/会话变量从未到达视图。

我有什么遗漏或做错了吗?

提前致谢。

【问题讨论】:

  • 会话变量是false。人们应该期望视图逻辑的@else 分支总是被执行。您可以改为为变量刷新 truthy 值
  • passedPassword 始终为 false,因为您在调用视图之前将其覆盖。
  • 是的,我需要它,因为有时视图可以有密码,有时没有

标签: php laravel laravel-5 laravel-blade


【解决方案1】:

正如 Dan 在 cmets 中告诉我的,我将会话变量的值设置为 false。 所以首先我在 show 方法中删除了\Session::flash('passedPassword', false);。

然后我修改我的刀片逻辑。就我而言,有时需要密码,有时不需要。

@if (($passwordLength === 0) || ($passwordLength !== 0 && Session::has('passedPassword')))

这样,如果资源没有密码,我们让用户通过。或者如果它有密码并且我们有passedPassword变量,我们也让用户看到内容。

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多