Laravel 路线中未识别路线

Route is not identified in Laravel route

我一直在努力学习laravel,但由于某些原因,在我需要传递诸如id之类的路由参数的情况下,我的路由没有被特别识别。 这是我的 web.php

Route::put('/todos/{$todo}/complete','TodoController@complete')->name('todos.complete');
Route::resource('/todos','TodoController');

这是我调用这条路线的地方

@foreach($todos as $todo)
    <li class="flex justify-between p2">
        @if($todo->completed)
            {{-- <p><del>{{$todo->title}}</del></p> --}}
            <p class="line-through">{{$todo->title}}</p>

        @else
        <p>{{$todo->title}}</p>
        @endif

        <div>
            <a href="{{route('todos.edit',[$todo->id])}}" class="btn btn-primary"><i class="fa fa-edit"></i></a>
            @if(!$todo->completed)      
        <span onclick="event.preventDefault();document.getElementById('form-complete-{{$todo->id}}').submit()" class="btn btn-danger fa fa-check px2" ></span>
        <form action="{{route('todos.complete',$todo->id)}}" id="{{'form-complete-'.$todo->id}}" method="post" style="display:none">
                @csrf
                @method('put')
               
            </form>
            @else
            <span onclick="event.preventDefault();" class="btn btn-success fa fa-check px2" ></span>
            <form action="{{route('todos.complete',$todo->id)}}" method="post" style="display:none">
                @csrf
                @method('put')

            </form>

            @endif
     
        </div>
        
    </li>   
           
    @endforeach

我的控制器设置如下:

public function complete(Todo $todo){
    $todo->update(['completed'=>true]);
    return redirect()->back()->with('message','Todo Completed');
}

这是我的路线:

| PUT       | todos/{$todo}/complete | todos.complete | App\Http\Controllers\TodoController@complete | web 

我在 post 编辑路径中遇到了类似的问题,我也需要传递参数。在那里我简单地使用资源方法解决了。但在这种情况下,因为我必须在控制器中输入自定义函数,所以路由不可用。 我在以下位置遇到 404 未找到错误:

http://127.0.0.1:8000/todos/1/complete

laravel 已经有一段时间了。所以我是新的路由基础知识。请帮帮我

尝试更改:

Route::put('/todos/{$todo}/complete','TodoController@complete')->name('todos.complete');

至:

Route::put('/todos/{todo}/complete','TodoController@complete')->name('todos.complete');

没有{$todo}$

参见:Route Parameters

路由参数在 URI 中定义为 {var} 而不是 {$var}:

'/todos/{todo}/complete'

route('todos.complete', ['todo' => $todo->id])