Как правильно перенаправить в другое представление после обновления

#php #laravel

#php #laravel

Вопрос:

У меня довольно много форм в моем веб-приложении. Однако я заметил, что как только я завершил публикацию и перенаправил пользователя на новую страницу, URL-адрес по-прежнему совпадает с URL-адресом обновления. И поскольку пользователь обновил страницу, он повторно отправляет запрос.

Ниже показано, как я обрабатываю свою пересылку.

 public function update(Request $request, Wedding $wedding, User $user)
{
    $user->attending = ($request->attending != null);
    $user->save();

    $message = "Sorry to hear you won't make it!";

    if ($user->attending) {
        $message = 'Welcome to the party pal!';
    }

    return view('pages.guest.rsvp')
        ->with(compact('wedding'))
        ->with(compact('user'))
        ->with('success', $message);
}
  

Итак, как только выполняется «return view …», пользователь перенаправляется на данное представление, что нормально, но это позволяет им обновить страницу и повторно отправить тот же пост.

Я использовал следующий код в качестве альтернативного теста.

 return redirect('/{$wedding->id}/rsvp')
    ->with(compact('wedding'))
    ->with(compact('user'))
    ->with('success', $message);
  

Однако, похоже, это не проходит через переменные (например, сообщение «успех»). Кроме того, это зависит от того, что я каждый раз вручную набираю URL-адрес со всеми параметрами URL, тогда как просто указать, какой вид использовать, кажется намного чище.


ОБНОВЛЕНИЕ: В ответ на Максим Степанов я обновил свой маршрут следующим:

 Route::get('rsvp', 'GuestMenuController@index')->name('rsvp');
  

Который работает (спасибо вам за это), однако теперь я перенаправляю следующим образом:

 return redirect()
        ->route('rsvp', ['wedding' => $wedding])
        ->with('success', $message);
  

Хотя перенаправление работает, сообщение об успешном завершении, похоже, не работает, сообщение перехватывается с помощью этого:

 @if (isset($success))
    <div class="alert alert-success">
        {{$success}}
    </div>
@endif
  

Я искал указания о том, почему элементы в «-> with (…» не проходят через перенаправления, но я не могу найти никого, у кого есть эта проблема — я предполагаю, что это связано с чем-то, что я делаю. Я просто не могу понять, что.

Комментарии:

1. Вы можете просто прошить переменные

Ответ №1:

Просто используйте route помощник с redirect помощником, чтобы указать имя маршрута, на который вы хотите перейти:

 return redirect()->route('your.route.name')->with([...]);
  

Примечание: Для этого требуется, чтобы вы назвали свой маршрут, например

 Route::get('/test', 'SomeController@index')->name('your.route.name');
  

или вы можете передать URL напрямую в redirect .

Когда вы вызываете view самостоятельно, хотя он загружает фактическое view , соответствующий контроллер не запускается, потому что контроллер привязан к запросу, а не к фактическому представлению.


with Помощник создает элемент сеанса flash, как таковой, вам нужно будет в вашем блейде получить к нему доступ через session помощника, а не как к прямой переменной:

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

Ответ №2:

Причина, по которой у вас возникают проблемы с доступом к переменным, которые вы пытаетесь передать с помощью with метода, заключается в том, что with метод отправляет данные в сеанс вместо того, чтобы передавать их непосредственно в представление. Смотрите следующую ссылку.

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

Итак, чтобы получить доступ к переменным в вашем представлении, вы можете просто извлечь сообщение об успешном завершении из данных сеанса

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

Ответ №3:

Маршрут:

 Route::get('/{$wedding}/rsvp', 'UpdateController@update')->name('wedding');
  

Контроллер:

 return redirect()->route('wedding', ['id' => $wedding->id])->with('success', $message);
  

или

 return redirect()->action(
    'UpdateController@update', ['wedding' => $wedding]
)->with('success', $message);
  

Комментарии:

1. Спасибо за ваш ответ, я обновил свой вопрос после того, как попробовал ваше предложение, похоже, проблема с сообщением об успешном прохождении по-прежнему, у вас нет каких-либо идей, не так ли?