【问题标题】:How to destroy a record using a form in Laravel and display status?如何在 Laravel 中使用表单销毁记录并显示状态?
【发布时间】:2021-01-03 04:09:25
【问题描述】:

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

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

这是我的代码:

在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 只是为了查看重定向是否有效,但它没有。当我单击“删除”按钮时,网址从http://127.0.0.1:8000/books/1/edit 变为http://127.0.0.1:8000/books/1?,末尾带有问号。我做错了什么?

我还有一个问题:如果我想返回状态,我应该使用类似的东西

Route::get('/', function () {
    return 'Deleted successfully';
});

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

谢谢!

【问题讨论】:

    标签: laravel forms http model-view-controller


    【解决方案1】:

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

    <form action="{{ route('books.destroy', $book->id)" method="POST">
      @csrf
      @method("DELETE")
      ...
    </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
    

    【讨论】:

    • 由于我假设是资源路由,所以我们不需要在web.php文件中额外添加路由。
    • @AhmadKarimi 有效点。更新了我的答案以使其更加明显。
    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多