【问题标题】:Laravel missing required parameters on destroy routeLaravel 在销毁路线上缺少必需的参数
【发布时间】:2020-07-07 23:45:30
【问题描述】:

我刚刚在 Laravel 中创建了一个类似于 todo list 的新项目。当我尝试进行简单删除时,我收到此错误:

缺少 [Route: destroy] [URI: {}] 的必需参数。 (查看:C:...\resources\views\index.blade.php)

这是 index.blade.php 的部分代码:

@if($todos)
    <ol>
       @foreach($todos as $todo)
           <li>{{ $todo->todo }}</li>
            <form action="" method="post">
                @csrf
                @method('Delete')
                <a href="{{ route('destroy', ['id' => $todo->id]) }}" class="btn btn-danger">x</a>
            </form>
       @endforeach
    </ol>
@endif

所以我只是检查是否有任何东西,如果没有,则不要显示列表。

来自控制器的部分代码:

public function index()
    {
        $todos = Todo::all();
        return view('index', ['todos' => $todos]);
    }


public function destroy($id)
{
    Todo::findOrFail($id)->delete();
}

web.php 中的代码行:

Route::resource('/', 'TodosController');

这是非常基本的,它让我发疯,因为我无法弄清楚是什么导致了这个错误。似乎一切都很好。

【问题讨论】:

  • php artisan route:list 并确保路由名称为destroy
  • 它们通常看起来像“todo.destroy”或“todos.destroy”。
  • prnt.sc/rnqyhc 只是破坏

标签: php laravel


【解决方案1】:

我不是 100% 确定,但请尝试将您的资源路由声明更新为:

Route::resource('todos', 'TodosController');

并将您的链接更改为

<a href="{{ route('todos.destroy', ['todo' => $todo->id]) }}" class="btn btn-danger">x</a>

在此处的文档中,https://laravel.com/docs/5.7/controllers#restful-naming-resource-route-parameters

他们将创建的路线描述为:

资源控制器处理的操作

DELETE /photos/{photo} 销毁 photos.destroy

【讨论】:

  • 这没有帮助:3
  • @SeadSilajdzic 你能告诉我们php artisan route:list 的输出吗?
  • @SeadSilajdzic 如果选择的答案仍然不是您所需要的,请查看我上面的更新。注意这将更新所有 url 以具有 /todos 前缀,但这应该是一切好好工作。您可能还需要 Qirel 的答案中的 @method('DELETE') 来使动词正确
  • ty 这么多哈哈,这部分使它工作需要将 Route::resource('/', ...) 更改为 Route::resource('todos', ...) ,在首先,我很奇怪为什么 route:list 上没有任何 uri,但现在我知道了。至少我学到了一些新东西:)
【解决方案2】:

您实际上并未提交表单。您只需单击一个链接,因此您实质上是发出 GET 请求,而不是 POST 请求。

您需要通过表格发送。

@foreach($todos as $todo)
    <li>{{ $todo->todo }}</li>

    <form action="{{ route('destroy', $todo->id) }}" method="POST">
        @csrf
        @method('DELETE')
        <input type="submit" class="btn btn-danger" value="x" />
    </form>
@endforeach

这样的内联表单可能看起来有点奇怪,因此您可以将按钮放在外面,然后在点击时提交表单。

@foreach($todos as $todo)
    <li>
        {{ $todo->todo }}
        <a href="#" class="btn btn-danger" 
           onclick="event.preventDefault();
                    document.getElementById('todo-destroy-{{ $todo->id }}').submit();">x</a>
    </li>

    <form action="{{ route('destroy', $todo->id) }}" method="POST" id="todo-destroy-{{ $todo->id }}">
        @csrf
        @method('DELETE')
    </form>
@endforeach

【讨论】:

  • 嗯,这不会产生“不允许的方法”错误吗?
  • 应该,这表明/destroy 也有一条 GET 路由(在 imo 中,这很糟糕)。
  • 啊,可能是这样,如果是这样,完全同意,另外,OP 想要的路线肯定是todos.destroy 或类似的,而不仅仅是destroy,....除非他们已经手动做了一些奇怪的事情
  • 这是一个公平的观点,我会添加 [ 'as' =&gt; 'todos' ] 作为资源的最终参数,因为它基于根文件夹 - 这样,如果他们稍后更改路由,它不会有很多其他地方要更新。
【解决方案3】:

Quirel,您的回答解决了我这个错误,但现在它并没有删除我的“帖子”。它只显示页面“未找到 - 404”。我已经尝试过修补程序,这行代码应该可以工作。

https://prnt.sc/rnqw1k

代码:

public function destroy($id)
    {
        $todo = Todo::findOrFail($id);
        $todo->delete();

        return redirect('/');
    }

您还可以解释一下为什么我们只发送 $todo->id 而不是 ['id'=>$todo->id] 作为第二个参数?

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 2020-06-04
    • 2021-11-06
    • 2021-09-04
    • 2023-02-07
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多