Не показывается предупреждающее сообщение о флеш-сессии в PHP Laravel - PullRequest
4 голосов
/ 04 июня 2019

В моем 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');

    }
}

Может ли кто-нибудь мне помочь?

Ответы [ 5 ]

6 голосов
/ 04 июня 2019

Похоже, вы используете класс сеанса, а не вспомогательный сеанс, который 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

NB. Это будет работать, только если вы используете страницу отправки.Если это отправка в формате javascript, вам может потребоваться обновить страницу, чтобы появилось предупреждение.

0 голосов
/ 04 июня 2019

Если приведенные выше ответы не дают желаемого результата, вам следует проверить, прошел ли ваш запрос проверку.

Попробуйте выполнить 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;
0 голосов
/ 04 июня 2019

Вы можете передать значения с помощью WithMessage вместо with, поэтому в контроллере вы будете перенаправлять, как это return back()->withMessage('Thanks for subscribing');, тогда в блейде вы можете получить доступ к сообщению с помощью

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

И длясообщение об ошибке, я бы лично использовал Валидатор laravel it self, чтобы вы могли получить доступ к таким ошибкам, как

@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 выписка в клинке

0 голосов
/ 04 июня 2019
@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']);

    }
}

таким образом он вернет массив, а не объект

0 голосов
/ 04 июня 2019

Я думаю, вы должны передать значение в виде массива ['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']);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...