如何使用 Laravel 中的表单销毁记录并显示状态?

How to destroy a record using a form in Laravel and display status?

我正在使用 Laravel,目前我正在资源控制器中实现 'destroy' 方法作为 CRUD 的一部分。该方法应删除我数据库中的指定记录。

该方法由我的 blade.php 文件调用,该文件使用带有 DELETE 方法和 route('my-resources.destroy', $my-resource->id) 的表单。我希望控制器 return 一个字符串,例如 'Deleted successfully!' 以便我可以将其显示给客户端。

这是我的代码:

在views/book/edit.blade.php:

<form method="DELETE" action="{{ route('books.destroy', $book->id) }}">
    <div class="form-item center">
        <button type="submit" class="btn-danger">Delete</button>
    </div>
</form>

在BookController.php中:

public function destroy($id)
    {
        $book = Book::find($id);
        $book->delete();

        return redirect()->away('https://www.google.com');
    }

我将重定向到 google.com 只是为了看看重定向是否有效,但它没有。当我单击 'Delete' 按钮时,url 从 http://127.0.0.1:8000/books/1/edit 变为 http://127.0.0.1:8000/books/1?,最后带有问号。我做错了什么?

我还有一个问题:如果我想 return 状态,我应该使用类似

的东西吗?
Route::get('/', function () {
    return 'Deleted successfully';
});

$request->session()->flash('status', 'Task was successful!');
/** and some random return statement **/

谢谢!

表单不支持 DELETE 方法,因此您需要使用 Laravel @method 助手来告诉 Laravel 您想要使用 DELETE动词。此外,您需要包含 Laravel 期望的 csrf 令牌,这是防止跨站点请求伪造的一部分。

<form action="{{ route('books.destroy', $book->id) }}" method="POST">
  @csrf
  @method("DELETE")
  ... // Button/link for submit this form
</form>

您可能需要定义 route 以便它接受 DELETE 请求,除非您定义了 resourceful 路由:

Route::delete('/books/{id}', 'BookController@destroy')
  ->name('books.destroy'); // Laravel 7
Route::delete('/books/{id}', [\App\Http\Controllers\BookController::class, 'destroy'])
  ->name('books.destroy'); // Laravel 8

如果您正在使用 resourceful 条路线,它们已经可供您使用:

Route::resource('/books', 'BookController'); // Laravel 7
Route::resource('/books', \App\Controllers\Http\BookController::class); // Laravel 8

对于您的 destroy 方法,设置要发回的 flash 消息:

public function destroy(Book $id)
{
  $id->delete();

  return redirect('/')->with('success', 'Book deleted');
}

然后在您的视图中闪现消息:

@if (session('success'))
  <p>{{ session('success') }}</p>
@endif