PHP Laravel会话Flash警报消息未显示

时间:2019-06-04 12:26:04

标签: php laravel

在我的laravel-app应用程序中,用户如果想要订阅新闻通讯,可以选中联系表单上的复选框。选中复选框并提交表单后,控制器中会进行检查,如果用户已被订阅,如果已订阅,则将显示一个闪烁的警报/消息,并带有“您已被订阅”之类的信息。 现在,检查本身可以正常工作,但是没有显示flash / alert消息,我也不知道为什么。

在我看来:

@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');

    }
}

有人可以帮我吗?

6 个答案:

答案 0 :(得分:6)

您似乎正在使用会话类,而不是会话帮助程序laravel插入服务容器。

如果您使用的是Laravel 5.8,则根据此处的文档,blade中的session是一个辅助功能:

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提交,则可能需要刷新页面以显示警报。

答案 1 :(得分:0)

我认为您应该将值作为数组['success'=>'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 :(得分:0)

@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']);

    }
}

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

答案 3 :(得分:0)

您可以使用WithMessage而不是with传递值,因此在控制器中您将像这样return back()->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语句一样访问它们

答案 4 :(得分:0)

如果以上答案仍未获得理想的结果,则应检查您的请求是否通过了验证。

尝试在验证后对请求进行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;

答案 5 :(得分:0)

在我的情况下,会话闪存仅适用于表单提交并返回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