Описание
У меня есть таблица, в которой я собираю значения из флажков с JavaScript. Эти значения следует отправлять на защищенный маршрут API в бэкэнде Laravel. Я использую стандартную настройку аутентификации Laravel (из коробки).
Вопрос
Что я должен отправить с пост-запросом JavaScript для аутентификации и как мне это сделать? Могу ли я добавить токен или что-то подобное в заголовки? В данный момент я получаю ответ:
«Это действие не авторизовано».
exception: "Symfony\\Component\\HttpKernel\\Exception\\AccessDeniedHttpException"
Редактировать
При текущая точка моего исследования api-токен кажется простым решением для моего случая. Но я не могу понять, как прикрепить токен API к почтовому запросу JavaScript.
Это функция JavaScript для сбора значений, хранящих их в объектах.
import SaveData from "../api/SaveData";
export default async function SaveMultipleReports() {
const table = document.getElementById("reports-dashboard");
const rows = table.querySelectorAll("div[class=report-tr]");
let reports = [];
for (const row of rows) {
const checkbox_visible = row.querySelector("input[name=visible]")
.checked;
const checkbox_slider = document.querySelector(
"input[name=show_in_slider]"
).checked;
const report = {
id: row.id,
visible: checkbox_visible,
show_in_slider: checkbox_slider
};
reports.push(report);
}
console.log(reports);
const response = await SaveData("/api/reports/update", reports);
console.log(response);
}
И это SavaData
функция:
export default async function SaveData(api, data) {
const token = document
.querySelector('meta[name="csrf-token"]')
.getAttribute("content");
const url = window.location.origin + api;
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-CSRF-TOKEN": token,
Accept: "application/json"
},
body: JSON.stringify(data)
});
const result = await response.json();
return result;
}
И это строка в api.php
:
Route::middleware("can:administration")->post("reports/update", "ReportsController@UpdateAll");
Весь репо здесь .
Спасибо за ваше время заранее:)
Редактировать 2
Пока я справился без JavaScript. Поместите все значения, я хочу обновить в форме и загрузить скрытый ввод для идентификатора каждого объекта (идентификатор необходим для контроллера впоследствии). Благодаря этому сообщению .
{!! Form::open(["route" => ["admin.reports.multiupdate"], "method" => "PUT", "class" => "report-table"]) !!}
... // some HTML
@foreach ($reports as $report)
<div class="report-tr">
<input type="hidden" name="reports[{{$loop->index}}][id]" value="{{$report->id}}">
<div class="td-name">
<p class="td-text">{{$report->name}}</p>
</div>
<div class="td-flex">{{$report->body}}</div>
<div class="tr-wrapper">
<div class="checkbox-visible">
<div class="checkbox-container">
<input class="checkbox" type="checkbox" name="reports[{{$loop->index}}][visible]" value="1" checked>
<span class="checkmark"></span>
</div>
<label class="table-label" for="visible">Sichtbar</label>
</div>
<div class="checkbox-slider">
<div class="checkbox-container">
<input class="checkbox" type="checkbox" name="reports[{{$loop->index}}][show_in_slider]" value="1"
{{($report->show_in_slider == 1 ? "checked" : "")}}>
<span class="checkmark"></span>
</div>
<label class="table-label" for="show_in_slider">Im Slider</label>
</div>
<div class="td-buttons">
...
@endforeach
<button class="floating-save">
@svg("saveAll", "saveAll")
</button>
{!! Form::close() !!}
и фрагменту из контроллера:
public function MultipleUpate(ReportUpdate $request)
{
$reports = $request->input("reports");
foreach ($reports as $row) {
$report = Report::find($row["id"]);
// giving the checkbox 0, if it isn't checked
$isVisible = isset($row["visible"]) ? 1 : 0;
$inSlider = isset($row["show_in_slider"]) ? 1 : 0;
$report->visible = $isVisible;
$report->show_in_slider = $inSlider;
$report->new = false;
if ($report->save()) {
$saved = true;
}
}
if ($saved == true) {
$request->session()->flash("success", "Änderungen gespeichert!");
} else {
$request->session()->flash("error", "Das hat nicht geklappt!");
}
return back();
Функция ReportUdpate
содержит только следующее:
public function authorize()
{
return true;
}
public function rules()
{
return [
"visible" => "nullable",
"show_in_slider" => "nullable"
];
}