在资源控制器中销毁后Laravel重定向

在资源控制器中销毁后Laravel重定向,laravel,Laravel,我想在删除项目后重定向到页面。我已经读了很多关于这方面的文章,包括,但似乎不起作用 按delete(删除)按钮后,当前发生的情况是,它会进入show(显示)页面,并给出一个404。这是因为该项目实际上已被删除,因此页面不再工作。但是根据我的代码,删除后应该重定向到路径trade.index 在路由/网络中 Route::resource('/trade', 'TradeController'); 在TradeController中 公共功能销毁($id) { $trade=trade::fin

我想在删除项目后重定向到页面。我已经读了很多关于这方面的文章,包括,但似乎不起作用

按delete(删除)按钮后,当前发生的情况是,它会进入show(显示)页面,并给出一个404。这是因为该项目实际上已被删除,因此页面不再工作。但是根据我的代码,删除后应该重定向到路径
trade.index

在路由/网络中

Route::resource('/trade', 'TradeController');
在TradeController中

公共功能销毁($id)
{
$trade=trade::findOrFail($id);
$trade->delete();
return redirect()->route('trade.index')->带有('success','trade deleted');
}
视图中的


@csrf
@方法('DELETE')
删除
来自路线:列表

DELETE | trade/{trade} | trade.destroy | App\Http\Controllers\TradeController@destroy                                
 | web,auth:web
我错过了什么

根据以下部分答案进行更新

首先,如果您通过artisan这样创建一个资源丰富的控制器

php artisan make:controller TradeController -r
Laravel在该控制器中生成此函数

public function destroy($id)
{
     //
}
所以这确实让我觉得将它与
$id
一起使用应该可以吗

我也跑过

config: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');
}

您的路由参数名
{trade}
,因此您不能在控制器函数中使用
$id
作为参数名

您应该使用
$trade
来匹配路由参数名称,或者
findOrFail()
函数将无法找到任何内容,因为
$id
null
,即:

公共功能销毁($trade)
{
$trade=trade::findOrFail($trade);
$trade->delete();
return redirect()->route('trade.index')->带有('success','trade deleted');
}
或者更好地使用隐式模型绑定

公共功能销毁(交易$Trade)
{
$trade->delete();
return redirect()->route('trade.index')->带有('success','trade deleted');
}

您可以阅读关于隐式绑定的laravel文档。

从您的
php artisan路径:list
运行结果

DELETE | trade/{trade} | trade.destroy | App\Http\Controllers\TradeController@destroy | web,auth:web
传递给
destroy()
方法的参数应绑定到名为
trade
的模型。因此,您必须为此设置路由模型绑定

首先转到以下文件:

app/Providers/RouteServiceProvider.php

并在
boot()方法中包含模型绑定(如果不存在)

RouteServiceProvider.php


findOrFail()可能会返回404响应。您能发布
php artisan路由:list
output吗?@dparoli我想不会,因为交易实际上已被删除。如果返回404,那么就永远不会发生
->delete()
,对吗?如图所示,删除操作执行正确,只是重定向没有发生@mdexp我已经为销毁操作添加了route:list结果。如果我坚持的话,很抱歉,但是你能尝试将dd($trade)放在findOrFail($id)之后,以查看应用程序是否到达dd()?只需将表单开始标记操作更改为:route('trade.destroy',['id'=>$trade->id])请考虑接受和投票,如果它解决了你的问题<代码>你的路由参数名是{Trase},所以你不能使用$id作为控制器函数中的变量变量。我可能是错的,但是如果我记得正确的话,我认为如果你不需要隐式绑定,这个参数可以被命名为任何你想要的。(但不能是类型提示)但是,如果您确实想使用隐式模型绑定,您必须将路由参数的名称与函数参数名称匹配,并键入提示模型,正如您所说的:@mdexp您是对的,我自己没有尝试过,我习惯给参数和注入变量赋予相同的名称,只是为了不出现问题。是的,我也这样做,为了me的确是更好、更多readable@dparoli这似乎不起作用。我已经更新了答案。不需要显式绑定,使用类型提示变量的隐式绑定就足够了,匹配的不是参数名和模型名,而是参数名和类型提示变量名。“如果boot()方法不存在,则在其中包含模型绑定。如果绑定不存在,则
销毁(Trade$Trade)
将不起作用。但是
销毁($Trade)
将在
路由::列表
指定了
交易/{id}
的情况下起作用。因此,无需进行否决表决。”您的delete函数需要类Trade的对象"这部分内容绝对错误且具有误导性,这就是否决投票的原因。您应该仔细阅读我回答中有关隐式绑定的链接。laravel中隐式绑定的90%问题是因为人们认为参数名称应该与模型名称匹配,但它应该与类型暗示的变量名称匹配。隐式如果路由参数的名称与控制器的类型提示参数相同,并且控制器类型提示类将用于检索模型,则绑定仍然有效instance@dparoli,好的,我将删除该部分。但我认为过去的参数不应与名称匹配。我认为是路由定义中包含的参数的名称应该与模型绑定中的匹配。
destroy(Trade$anything)
非常有效。
app/Providers/RouteServiceProvider.php