Маршрут не указан в маршруте Laravel

Я пытался изучить 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 

У меня была аналогичная проблема в маршруте публикации для редактирования, где мне также нужно было передать параметр. Там я просто решил ресурсным методом. Но в этом случае, поскольку мне пришлось ввести пользовательскую функцию в контроллер, маршрут недоступен. У меня ошибка 404: не найдено:

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

Прошло много времени с тех пор, как я сделал ларавел. Итак, я новичок в основах маршрутизации. Пожалуйста, помогите мне


person MaestroAshmin    schedule 16.07.2020    source источник
comment
В параметрах маршрута не используется $ ... в '/todos/{$todo}/complete', это должно быть '/todos/{todo}/complete'. laravel.com/docs/7.x/routing#route-parameters   -  person brombeer    schedule 16.07.2020


Ответы (2)


Попробуйте изменить:

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

to:

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

Без $ из {$todo}

См. Параметры маршрута.

person loic.lopez    schedule 16.07.2020
comment
Большое спасибо, теперь я понимаю - person MaestroAshmin; 16.07.2020
comment
@MaestroAshmin рад помочь вам! - person loic.lopez; 16.07.2020
comment
@MaestroAshmin не забудьте принять / проголосовать за ответ, соответствующий вашему вопросу - person loic.lopez; 16.07.2020

Параметры маршрута определены в URI как {var}, а не {$var}:

'/todos/{todo}/complete'

route('todos.complete', ['todo' => $todo->id])
person lagbox    schedule 16.07.2020
comment
Большое спасибо, теперь я понимаю - person MaestroAshmin; 16.07.2020