#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. Спасибо за ваш ответ, я обновил свой вопрос после того, как попробовал ваше предложение, похоже, проблема с сообщением об успешном прохождении по-прежнему, у вас нет каких-либо идей, не так ли?