如何使用 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
我正在使用 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