Мой ответ состоит в изменении как минимум двух файлов: шаблона, в котором выполняется ajax, и контроллера, который получает запрос формы. Все методы, которые получают действия от форм на странице, должны возвращать обновленный токен csrf, и все поля (если таковые имеются), которые содержат значение csrf, также должны обновляться после выполнения ajax.
Сначала, шаблон blade-сервера будет использовать общий токен csrf для всех форм в документе, для этого я добавил мета-токен csrf в свой раздел заголовка, как обычно:
<meta name="csrf-token" content="{{ csrf_token() }}">
Теперь ajax скрипт должен вставить в форму токен и обновить мета после выполнения любой из форм в шаблоне:
$( 'body' ).on( 'submit', '.form', function( event ){
event.preventDefault();
let fd = new FormData( $( this )[ 0 ] );
fd.append( '_token', $( 'meta[name="csrf-token"]' ).attr( 'content' ) )
$.ajax( {
url : '{{ route( 'service.update', [ 'service' => $service ] ) }}',
method : 'post',
data : fd,
contentType: false,
processData: false,
success: function( response ){
$( 'meta[name="csrf-token"]' ).attr( 'content', response.token );
//Do all the other things that need to be done...
},
error: function( xhr, status, error ){
console.log( error );
}
} );
} );
Теперь первое, что я делаю, это создаю объект FormData
с содержимым сформируйте и добавьте значение csrf из мета в набор полей (fd.append( '_token', $( 'meta[name="csrf-token"]' ).attr( 'content' ) )
).
После завершения выполнения my javascript получит ответную переменную со значением .token, которая содержит новый csrf -token value, поэтому я обновляю старое мета-значение fre sh one: $( 'meta[name="csrf-token"]' ).attr( 'content', response.token );
.
Теперь для стороны контроллера все, что мне нужно сделать, это добавить к jSon, токену v alue, в моем случае это массив, поэтому мне нужно только добавить его следующим образом:
$response[ 'token' ] = $request->session()->token();
return $response;
Теперь формы будут работать нормально, спасибо