В этом представлении есть ссылка, которая вызывает функцию javascript
@extends('layouts.main') @section('content') <table class="table"> <tr> <th>ID</th> <th>Nombre</th> <th>Opción</th> </tr> @foreach ($tasks as $task) <tr> <td>{{$task->id}}</td> <td>{{$task->name}}</td> <td><a href="javascript:void(0)" onclick="eliminar({{$task->id}})" class="btn btn-danger">Eliminar</a></td> </tr> @endforeach </table> @stop
и вот код javascript
function eliminar(id){ $.ajax({ type: "DELETE", url: "task/"+id, success: function (data) { console.log(data); }, error: function (data) { alert('Error:', data); } }); }
и с вызовом ajax я хочу вызвать метод destroy моего контроллера
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Task; class TaskController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $tasks = Task::all(); return view('mainview',['tasks' => $tasks]); } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { return "destroy"; } }
Но когда я нажимаю ссылки, я получаю эту ошибку:
Ошибка TokenMismatchException в строке VerifyCsrfToken.php 67
Я новичок в Laravel, но я думал, что csrf для форм.
Вы должны добавить csrf_field
к основному csrf_field
:
{{ csrf_field() }}
Затем добавьте _token
к вашему запросу:
var _token = $('input[name="_token"]').val(); function eliminar(id){ $.ajax({ type: "DELETE", url: "task/"+id, data: { _token : _token }, success: function (data) { console.log(data); }, error: function (data) { alert('Error:', data); } }); }
Или вы можете добавить его один раз в ajaxSetup
и это повлияет на все вызовы на производные $.ajax
или Ajax, такие как $.get()
:
$.ajaxSetup( { headers: { 'X-CSRF-Token': $('input[name="_token"]').val() } });
Посмотрите на CSRF Protection .
Надеюсь это поможет.
Это то, что сработало для меня. Я нашел несколько ответов в Интернете, и никто из них не работал; однако, после объединения всех, я получил вызов Ajax, чтобы пройти.
В главе вашего файла просмотра добавьте следующую строку:
<meta name="csrf-token" content="<?php echo csrf_token() ?>"> // This will retrieve the necessary token.
Затем извлеките значение токена и поместите его на переменную (необязательный шаг):
var currentToken = $('meta[name="csrf-token"]').attr('content');
На ваш вызов ajax укажите значение токена в поле «data:»:
$.ajax({type: 'POST', data: {_token:currentToken},....});
Вы можете избежать необязательного шага создания новой переменной в поле «data:»; однако, я считаю, что этот шаг легче понять.
Надеюсь это поможет.
При передаче метода DELETE необходимо добавить поле ввода токена.
Html:
<input class="token" value="{{ csrf_field() }}"/>
Код:
function eliminar(id){ var formData = '_token=' + $('.token').val(); $.ajax({ type: "DELETE", url: "task/"+id, data: formData, success: function (data) { console.log(data); }, error: function (data) { alert('Error:', data); } }); }
Вы также можете удалить этот маршрут из процесса проверки, добавив его в массив except в промежуточном программном обеспечении.