Laravel баг с обновлением страницы
Суть такова, что у меня на главной странице есть форма - по нажатию на кнопку срабатывает метод, заносит данные в бд и возвращает меня обратно. Однако когда я пытаюсь перезагрузить страничку после этого, метод срабатывает снова и в бд заносится точно такая же запись, хотя форма уже пустая и, казалось бы, отправлять уже нечего. (Да и почему метод вообще срабатывает, если я f5 нажимаю) Не пойму в чем проблема
Форма с главной страницы
<form action="{{route('calculate')}}"
method="POST"
enctype="multipart/form-data"
class="form-inline py-5">
@csrf
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg">
<label class="col-4" for="workplaces">
Кол-во рабочих мест
</label>
<input type="number" name="wp" class="col-2 form-control text-center">
<span class="col-4">Кол-во рабочих мест расчитывается как сумма сотрудников + кол-во отдельно стоящией техники (принтеры, факсы).</span>
</div>
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg">
<label class="col-4" for="hl">
Длина лаборатории <span class="text-muted px-2">в метрах</span>
</label>
<input type="number" name="hl" class="col-2 form-control text-center">
<span class="col-4">Укажите длину лаборатории.</span>
</div>
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg">
<label class="col-4" for="wl">
Ширина лаборатории <span class="text-muted px-2">в метрах</span>
</label>
<input type="number" name="wl" class="col-2 form-control text-center">
<span class="col-4">Укажите ширину лаборатории.</span>
</div>
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg">
<label class="col-4" for="ct">
Тип кабеля
</label>
<select name="ct" class="col-2 form-control" id="cable" onchange="myFunction()">
@if($values != "")
@foreach($values->where('category', 'cable') as $value)
<option class="text-center" value="{{$value->title}}">
{{$value->title}}
</option>
@endforeach
@endif
</select>
<span class="col-4">Тип сетевого кабеля, посредством которого осуществляется передача данных между устройствами.</span>
</div>
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg" id="connection" hidden>
<label class="col-4" for="cc">
Категория подключения
</label>
<select name="cc" class="col-2 form-control">
@if($values != "")
@foreach($values->where('category', 'connection') as $value)
<option class="text-center" value="{{$value->title}}">
{{$value->title}}
</option>
@endforeach
@endif
</select>
<span class="col-4">Категория 5Е - обеспечивает скорость передачи данных на скорости 100Mb/s <br>
Категория 6 - обеспечивает скорость передачи данных на скорости 1000Mb/s.</span>
</div>
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg">
<label class="col-4" for="tp">
Тип топологии сети
</label>
<select name="tp" class="col-2 form-control">
@if($values != "")
@foreach($values->where('category', 'topology') as $value)
<option class="text-center" value="{{$value->title}}">
{{$value->title}}
</option>
@endforeach
@endif
</select>
<span class="col-4">Топология определяет структуру сети о том, как все компоненты взаимосвязаны друг с другом.</span>
</div>
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg">
<label class="col-4" for="sw">
Свитч
</label>
<div class="col-2 px-0 mx-0">
<span>
<select name="sw" class="form-control col">
@if($values != "")
@foreach($values->where('category', 'switch') as $value)
<option class="text-center" value="{{$value->title}}">
{{$value->title}}
</option>
@endforeach
@endif
</select>
<span class="form-inline">
<label class="col text-muted">Кол-во</label>
<input type="number" name="swc" class="col-5 form-control text-center my-2" title="Кол-во" value="1">
</span>
</span>
</div>
<span class="col-4">Сетевой коммутатор — это электронный прибор, объединяющий несколько компьютеров и/или других цифровых устройств в локальную сеть</span>
</div>
<div class="form-inline w-100 justify-content-between align-content-center border p-2 my-2 rounded blue-light-bg">
<label for="ad" class="col-4">
Дополнительно
</label>
<div class="col-2 px-0 mx-0" id="filters">
<span>
<select name="ad[]" class="form-control w-100">
@if($values != "")
@foreach($values->where('category', 'additional') as $value)
<option class="text-center" value="{{$value->title}}">
{{$value->title}}
</option>
@endforeach
@endif
</select>
<span class="form-inline">
<label class="col text-muted">Кол-во</label>
<input type="number" name="adc[]" class="col-5 form-control text-center my-2" title="Кол-во" value="1">
</span>
</span>
</div>
<div class="col-4">
<button type="button"
class="btn btn-outline-primary"
onclick="addFilter" id="addFilter">Добавить поле
</button>
<button type="button"
class="btn btn-outline-dark"
onclick="removeFilter" id="removeFilter">Убрать поле
</button>
</div>
</div>
<div class="w-100 justify-content-center form-inline">
<div class="col">
<button type="submit" class="btn-lg btn-primary my-3">Расчитать</button>
</div>
@if(isset($total_price))
<div class="col">
<label>Стоимость материалов: {{$total_price}}</label>
</div>
@endif
</div>
</form>
Метод-обработчик формы
public function calculate(Request $request)
{
$calcData = $request->all();
// Валидация данных
$validator = Validator::make($calcData,
[
'wp' => 'required|min:1|integer|',
'hl' => 'required|min:1|integer|',
'wl' => 'required|min:1|integer|',
'swc' => 'required|min:1|integer'
]);
if($validator->fails()) {
return redirect(route('main-page'))
->withErrors($validator)
->withInput();
}
//Установка главной величины для расчётов (ширина или длина)
if ($calcData['hl'] > $calcData['wl']){
$size = $calcData['hl'];
}
else{
$size = $calcData['wl'];
}
//Цена и название кабеля (тип подключения для витой пары)
if ($calcData['ct'] == 'Витая пара')
{
$connection = Value::where('title', $calcData['cc'])->first();
$cable = [
'n' => $calcData['ct'],
'p' => $connection->value,
'cc' => $calcData['cc']
];
}
else{
$cable = [
'n' => $calcData['ct'],
'p' => Value::where('title', $calcData['ct'])->first()->value,
'cc' => ''
];
}
//Расчёт стоимости кабеля исходя из необходимой длины согласно топологии и размеров кабинета
if ($calcData['tp'] == 'Топология Шины')
{
$length = 3 + $size + $calcData['wp']/2;
$cable += [
'f' => "3м + Длина лаборатории + Кол-во рабочих мест/2",
'c' => $length,
'pt' => intval($length * $cable['p'])];
}
elseif ($calcData['topology'] == 'Топология Звезды')
{
$length = 3 + $size + $calcData['workplaces'] * 1.5;
$cable += [
'f' => "3м + Длина лаборатории + Кол-во рабочих мест * 1.5",
'c' => $length,
'pt' => intval($length * $cable['p'])
];
}
else
{
$length = 3 + $size/2 * 6.28;
$cable += [
'f' => "3м + Длина лаборатории/2 + 2pi",
'c' => $length,
'pt' => intval($length * $cable['p'])];
}
//Кабель-канал
$canal = [
'f' => $cable['f'],
'c' => $cable['c'],
'p' => Value::where('title', 'Кабель канал')->first()->value,
];
$canal += [
'pt' => $canal['p'] * $canal['c']
];
//Розетки --//-- Сетевые розетки
$socket = [
'f' => 'Кол-во рабочих мест * 2',
'c' => $calcData['wp'] * 2,
'p' => Value::where('title', 'Розетка')->first()->value,
];
$socket += [
'pt' => $socket['p'] * $socket['c']
];
$p_socket = [
'f' => 'Кол-во рабочих мест * 2',
'c' => $calcData['wp'] * 2,
'p' => Value::where('title', 'Сетевая розетка')->first()->value,
];
$p_socket += [
'pt' => $p_socket['p'] * $p_socket['c']
];
//Свитч
$switchGet = Value::where('title', $calcData['sw'])->first();
$switch = [
'n' => $switchGet->title,
'p' => $switchGet->value,
'c' => $calcData['swc'],
];
$switch += [
'pt' => $switch['p'] * $switch['c'],
];
// Итоговая цена
$total_price = $socket['pt'] + $p_socket['pt'] + $cable['pt'] + $switch['pt'] + $canal['pt'];
//Создание записи
$calc = new Calculation();
if(Auth::user())
$calc->user_id = Auth::user()->id;
else
{
$calc->user_id = 0;
}
$calc->socket_f = $socket['f'];
$calc->socket_c = $socket['c'];
$calc->socket_p = $socket['p'];
$calc->socket_pt = $socket['pt'];
$calc->p_socket_f = $p_socket['f'];
$calc->p_socket_c = $p_socket['c'];
$calc->p_socket_p = $p_socket['p'];
$calc->p_socket_pt = $p_socket['pt'];
$calc->cable_f = $cable['f'];
$calc->cable_n = $cable['n'];
$calc->cable_cc = $cable['cc'];
$calc->cable_c = $cable['c'];
$calc->cable_p = $cable['p'];
$calc->cable_pt = $cable['pt'];
$calc->switch_n = $switch['n'];
$calc->switch_c = $switch['c'];
$calc->switch_p = $switch['p'];
$calc->switch_pt = $switch['pt'];
$calc->canal_f = $canal['f'];
$calc->canal_c = $canal['c'];
$calc->canal_p = $canal['p'];
$calc->canal_pt = $canal['pt'];
$calc->total = $total_price;
$calc->save();
if (isset($calcData['ad'])) {
foreach ($calcData['ad'] as $i=>$add) {
$ad = new Additioanl();
$ad->calc_id = $calc->id;
$ad->add_n = Value::where('title', $add)->first()->title;
$ad->add_c = $calcData['adc'][$i];
$ad->add_p = Value::where('title', $add)->first()->value;
$ad->add_pt = $calcData['adc'][$i] * Value::where('title', $add)->first()->value;
$ad->save();
$total_price += $ad->add_pt;
DB::table('calculations')->update(['total' => $total_price]);
}
}
return view('index', ['total_price' => $total_price]);
}
В web.php и PageController'e всё "чисто" Браузер - Microsoft Edge
Прошу прощения за большое кол-во кода, я правда не знаю в чем проблема и какая инфа может понадобиться для её решения.
Гуглил - ничего не нашел, либо искать не умею