【发布时间】:2019-08-18 15:27:36
【问题描述】:
我想在删除一个项目后重定向到一个页面。我已经阅读了多篇关于此的帖子,包括 this one,但它似乎不起作用。
按下删除按钮后当前发生的情况是它进入了显示页面并给出了 404。那是因为该项目实际上已被删除,因此该页面不再工作。但根据我的代码,删除后应该重定向到路由trade.index。
在路线/网络中
Route::resource('/trade', 'TradeController');
在 TradeController 中
public function destroy($id)
{
$trade = Trade::findOrFail($id);
$trade->delete();
return redirect()->route('trade.index')->with('success', 'Trade deleted');
}
在视图中
<form action="{{ route('trade.destroy', $trade->id) }}" method="post">
@csrf
@method('DELETE')
<button class="btn btn-lg btn-danger btn-block btn-animate" type="submit">
<i class="far fa-trash-alt"></i> Delete
</button>
</form>
来自路线:列表
DELETE | trade/{trade} | trade.destroy | App\Http\Controllers\TradeController@destroy
| web,auth:web
我错过了什么?
根据下面的一些答案进行更新
首先,如果你像这样通过工匠创建一个足智多谋的控制器
php artisan make:controller TradeController -r
Laravel 在那个控制器中生成这个函数
public function destroy($id)
{
//
}
所以这确实让我认为将它与$id 一起使用应该可以吗?
我也跑过
config:clear
和
cache:clear
确定。奇怪的是,我上面发布的原始代码现在有时可以工作(它可以正确删除和重定向),然后几次之后它就不起作用了(它确实删除了,但重定向不起作用)。如果我使用route('trade.destroy', ['id' => $trade->id]),那也是一样的。
另一件事是,对于 show() 我使用相同的原则。视图中使用的路线:
route('trade.show', $trade->id)
控制器中的方法:
public function show($id)
{
$data = array(
'trade' => Trade::findOrFail($id),
);
return view('trade.show')->with($data);
}
如果我按照其中一个答案使用以下方法,它仍然不起作用。
public function destroy(Trade $trade)
{
$trade->delete();
return redirect()->route('trade.index')->with('success', 'Trade deleted');
}
【问题讨论】:
-
findOrFail() 可能会返回 404 响应。
-
你能发布
php artisan route:list输出吗? -
@dparoli 我猜不是因为交易实际上被删除了。如果返回 404,那么
->delete()将永远不会发生,对吧?表明删除操作正确执行,只是重定向没有发生。 @mdexp 我已经为销毁操作添加了 route:list 结果。 -
对不起,如果我坚持,但你能尝试把 dd($trade) 放在 findOrFail($id) 之后,看看应用程序是否到达 dd()?
-
只需将表单打开标签操作更改为:route('trade.destroy', ['id' => $trade->id])
标签: laravel