【问题标题】:PHP Laravel session flash alert message not showingPHP Laravel 会话闪烁警报消息未显示
【发布时间】:2019-10-19 23:35:30
【问题描述】:

在我的laravel-app 中,如果用户想要订阅时事通讯,可以选中联系表单上的复选框。当复选框被选中并提交表单时,控制器中会出现一个检查,如果用户已经订阅,如果是这样,应该会出现一个闪烁警报/消息,例如“您已经订阅”。 现在,检查本身有效,但没有显示闪光/警报消息,我不知道为什么。

在我看来:

@if (\Session::has('success'))
    <div class="alert alert-success">
       <p>{{ \Session::get('success') }}</p>
    </div>
@endif
@if (\Session::has('failure'))
    <div class="alert alert-danger">
       <p>{{ \Session::get('failure') }}</p>
    </div>
@endif
 <div class="contact-form" id="contact">
     <form method="POST" action="{{ route('contact.store') }}">
     ...
     </form>
 </div>

在我的控制器中:

// when the checkbox is checked!

if (!empty(request()->newsletter)) {
    if (!Newsletter::isSubscribed(request()->email)) {
        Newsletter::subscribePending(request()->email);

        return redirect()->route('contact.create')->with('success', 'Thanks for subscribing!');

    } else {

        return redirect()->route('contact.create')->with('failure', 'You are already subscribed');

    }
}

有人可以帮帮我吗?

【问题讨论】:

标签: php laravel


【解决方案1】:

我认为您应该将值作为数组 ['success'=&gt;'Thanks for subscribing!' 传递,试试这个。

if (!empty(request()->newsletter)) {
    if (!Newsletter::isSubscribed(request()->email)) {
        Newsletter::subscribePending(request()->email);

        return redirect()->route('contact.create')->with(['success'=>'Thanks for subscribing!']);

    } else {

        return redirect()->route('contact.create')->with(['failure'=> 'You are already subscribed']);

    }
}

【讨论】:

    【解决方案2】:

    您似乎正在使用会话类,而不是 laravel 在服务容器上注入的会话助手。

    如果您使用的是 Laravel 5.8,刀片中的会话是一个辅助函数,根据此处的文档:

    https://laravel.com/docs/5.8/responses#redirecting-with-flashed-session-data

    一个例子

    Route::post('user/profile', function () {
        // Update the user's profile...
    
        return redirect('dashboard')->with('status', 'Profile updated!');
    });
    

    所以像这样在刀片中使用辅助函数:

    @if (session('status'))
        <div class="alert alert-success">
            {{ session('status') }}
        </div>
    @endif
    

    注意:这仅在您使用页面提交时才有效。如果是 javascript 提交,您可能需要刷新页面才能显示警报。

    【讨论】:

    • @ST80 你在使用 Laravel 5.8 吗?如果不是,文档将是错误的!
    • @ST80 你能告诉我们更多关于什么不起作用的信息吗?如果您只是告诉我们它失败了​​,而不是告诉我们您遇到的方式、原因或行为是什么,那么很难为您提供帮助。
    • hmm,如果我点击网络选项卡,则会列出重定向的路由,当我点击预览选项卡时,会出现页面的原始版本 -> 带有消息 ....跨度>
    • 是的,表单是用 javascript 提交的——好的,那就是问题所在:-s
    • 我使用的是 laravel 5.8!我的验证错误在会话中!!不同于文档大声笑
    【解决方案3】:
    @if (Session::has('success'))
        <div class="alert alert-success">
           <p>{{Session::get('success') }}</p>
        </div>
    @endif
    @if (Session::has('failure'))
        <div class="alert alert-danger">
           <p>{{ Session::get('failure') }}</p>
        </div>
    @endif
    

    我喜欢这样做,你可以试试

    @if (session('success'))
                    <div class="alert alert-success">
                        {{ session('success') }}
                    </div>
                @endif
    @if (session('failure'))
                    <div class="alert alert-danger">
                        {{ session('failure') }}
                    </div>
                @endif
    

    然后编辑你的控制器

    if (!empty(request()->newsletter)) {
        if (!Newsletter::isSubscribed(request()->email)) {
            Newsletter::subscribePending(request()->email);
    
            return redirect()->route('contact.create')->with(['success'=> 'Thanks for subscribing!']);
    
        } else {
    
            return redirect()->route('contact.create')->with(['failure'=>'You are already subscribed']);
    
        }
    }
    

    这样它会返回一个数组而不是一个对象

    【讨论】:

    • 那么问题出在您的控制器上,尝试从您的控制器返回一个值并 dd() 它
    【解决方案4】:

    您可以使用 WithMessage 而不是 with 传递值,因此在控制器中您将像这样重定向 return back()-&gt;withMessage('Thanks for subscribing');然后在刀片中您可以使用

    访问消息
    @if (session('message'))
       <div class="alert alert-success">
          {{ session('message') }}
       </div>
    @endif
    

    对于错误消息,我会亲自使用 laravel 的验证器,这样您就可以访问这样的错误

    @if($errors->any())
    <div class="form-group">
        @foreach($errors->all() as $error)
            <div class="alert alert-danger">
                <ul>
                    <li> {{ $error }} </li>
                </ul>
            </div>
        @endforeach
    </div>
    @endif
    

    也像@Niklesh Raut 提到的那样,您也可以将其设为数组并像刀片中的@if 语句一样访问它们

    【讨论】:

    • 你试过return redirect()-&gt;route('contact.create')-&gt;withMessage('Thanks for subscribing!');然后用@if(session('message'))在刀片中访问它们
    • 是的,但运气不好。如果我点击网络选项卡,我会得到重定向的路由,并且在预览中有一个原始版本的页面 -> 带有消息 ....
    • 您是否也尝试过return back(),您能否说出您使用的是哪个版本的laravel 以及dd()die() 最终出现在该页面上吗?
    【解决方案5】:

    如果上述答案没有让您获得想要的结果,您应该检查您的请求是否通过了验证。

    在验证后尝试 dd() 请求,看看是否从请求中得到结果。

    如果问题在于会话的闪烁,这就是我喜欢的方式。

    if (!empty(request()->newsletter)) {
        if (!Newsletter::isSubscribed(request()->email)) {
            Newsletter::subscribePending(request()->email);
            Session::flash('message', 'Thanks for subscribing!');
            Session::flash('alert-class', 'alert-success');
            return redirect()->route('contact.create');
    
        } else {
            Session::flash('message', 'You are already subscribed!');
            Session::flash('alert-class', 'alert-danger');
            return redirect()->route('contact.create');
    
        }
    }
    

    然后在视图中我使用这个代码块来显示消息。

      @if(Session::has('message'))
          <div class="form-group row">
              <div class="col-6">
                  <p class="alert {{ Session::get('alert-class', 'alert-info') }}">{{ 
                    Session::get('message') }}</p>
              </div>
          </div>
      @endif
    

    不要忘记对控制器顶部会话的引用!

    use Session;
    

    【讨论】:

      【解决方案6】:

      在我的例子中,session flash 只是处理表单提交和返回 redirect()。

      我正在使用 Laravel 5.8

      -控制器

      class HomeController extends Controller
      {
          public function index()
          {
              return view('welcome');
          }
      
          public function test(Request $request)
          {
              return redirect()->back()->with(['success' => 'Thanks for subscribing']);
          }
      }
      
      
      • 路线
      Route::get('/home', 'HomeController@index');
      Route::post('/test', 'HomeController@test');
      
      • 查看
      @if ($message = session('success'))
        <div class="alert alert-success alert-block">
          <strong>{{ $message }}</strong>
        </div>
      @endif
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多