Laravel在销毁路线上缺少必需的参数

时间:2020-03-27 08:45:30

标签: php laravel

我刚刚在Laravel中创建了一个类似于待办事项列表的新项目。当我尝试进行简单删除时,出现此错误:

缺少[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');

这是如此基本,这使我发疯,因为我不知道是什么导致了此错误。似乎一切都很好。

3 个答案:

答案 0 :(得分:0)

您实际上并未提交表格。您只需单击一个链接即可,从本质上讲,您发出的是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

答案 1 :(得分:0)

不确定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

他们将路线描述为:

资源控制器处理的操作

删除/ photos / {photo}销毁photos.destroy

答案 2 :(得分:0)

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

https://prnt.sc/rnqw1k

代码:

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

        return redirect('/');
    }

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