Отсутствует необходимый параметр для [Маршрут: задачи.обновление] [URI: задачи/{задача}] [Отсутствует параметр: задача]

#php #laravel #laravel-8 #crud

Вопрос:

Я использую laravel 8 для операции редактирования, для которой я создал контроллер ресурсов с помощью команды php artisan, и создание отлично сработало, но операция редактирования работает неправильно, что приводит к ошибке » Отсутствует необходимый параметр для [Маршрут: задачи.обновление] [URI: задачи/{задача}] [Отсутствует параметр: задача]».

web.php

 use IlluminateSupportFacadesRoute;
use AppHttpControllersTaskController;

Route::resource('tasks', TaskController::class);
 

list.blade.php

 <table class="table table-bordered">
<thead>
  <tr>
    <th>Title</th>
    <th>Assigned User</th>
    <th>Status</th>
    <th>Action</th>
  </tr>
</thead>
<tbody>
    @if(count($tasks)>0)
        @foreach($tasks AS $record)
            <tr>
              <td>{{ $record->title }}</td>
              <td>{{ $record->name }}</td>
              <td>{{ $record->status }}</td>
              <td> <a href="{{ route('tasks.edit', $record->id) }}"> Edit </a> | <a href="{{ route('tasks.delete', $record->id) }}"> Delete </a> </td>
            </tr>
        @endforeach
    @else
        <tr><td colspan="3" align="center">No Records Found.</td></tr>
    @endif
 </tbody>
</table>
 

edit.blade.php

 <form name="" action="{{ route('tasks.update', $record->id) }}" method="POST">
@csrf
@method('PUT')
<div class="form-group">
    <label for="title">Title: </label>
    <input type="text" name="title" class="form-control" placeholder="Enter Title" value="{{ $record->title }}">
    <span class="text-danger">@error('title') {{ $message }} @enderror</span>
</div>
<div class="form-group">
    <label for="password">Assign to User: </label>
    <select class="form-control" name="assigned_user_id">
        <option value="">--Select User--</option>
        @foreach($users as $each_user)
            <option value="{{ $each_user->id }}" {{ ($each_user->id == $record->assigned_user_id) ? 'selected' : '' }} >{{ $each_user->name }}</option>
        @endforeach
    </select>
    <span class="text-danger">@error('assigned_user_id') {{ $message }} @enderror</span>
</div>
<div class="form-group">
    <label for="password">Task Status: </label>
    <select class="form-control" name="task_status_id">
        <option value="">--Select Status--</option>
        @foreach($task_status as $each_status)
            <option value="{{ $each_status->id }}" {{ ($each_status->id == $record->task_status_id) ? 'selected' : '' }} >{{ $each_status->status }}</option>
        @endforeach
    </select>
    <span class="text-danger">@error('task_status_id') {{ $message }} @enderror</span>
    </div>
   <div class="form-group">
    <button type="submit" class="btn btn-block btn-primary">Update</button>
 </div>
 <br>
</form>
 

TaskController.php

 public function edit(Task $id)
{
    // echo $id;exit;
    $task = Task::find($id);
    $users = DB::table('users')->get();
    $task_status = DB::table('task_status')->get();
    // dd($task);
    return view('tasks.edit',['record'=>$task,'users'=>$users, 'task_status'=>$task_status]);
}
public function update(Request $request,Task $id)
{
   
}
 

Любая помощь, спасибо.

Комментарии:

1. Вам нужно передать ID (в данном случае первичный ключ задачи), инициализировав параметр из действия блейд-маршрута. Официальная документация о маршрутах ресурсов . Вы также можете передать свои параметры тем {{ route('tasks.edit', ['task' => $record->id]}} же способом и для маршрута обновления.

2. Может быть, попробуете проверить документы маршрутизации ?

Ответ №1:

В вашей форме измените это

 action="{{ route('tasks.update', $record->id)
 

Для

 action="{{ route('tasks.update', ['task' => $record->id])
 

и совет:

Документы Laravel:

Laravel автоматически разрешает красноречивые модели, определенные в маршрутах или действиях контроллера, имена переменных типа которых соответствуют имени сегмента маршрута.

В своем коде вы должны изменить это

 public function edit(Task $id)
{
    $task = Task::find($id);
    $users = DB::table('users')->get();
    $task_status = DB::table('task_status')->get();
    return view('tasks.edit',['record'=>$task,'users'=>$users, 'task_status'=>$task_status]);
}
 

Для

 public function edit(Task $task) 
{
    //$task = Task::find($id); Task is already loaded (($id ==> $task))
    $users = DB::table('users')->get();
    $task_status = DB::table('task_status')->get();
    return view('tasks.edit',['record'=>$task,'users'=>$users, 'task_status'=>$task_status]);
}
 

И если вы не хотите привязывать модель, удалите «Задачу» из параметров.

Комментарии:

1. Хотя это хороший совет, намекающее на тип не имеет ничего общего с фактической ошибкой ОП. route() Обновление-это все, что требуется для исправления их ошибки.

2. @Не говори хм, ты прав.. Я обновил ответ.

3. @CornelRaiu Как говорится в моем первом комментарии, ошибка OP не имеет ничего общего с намеком на тип. Маршрут ресурса называет параметр {task} , поэтому route() помощник ожидает task , что, как подтверждает сообщение об ошибке msg: » Отсутствует параметр: задача «. То, что происходит в контроллере, является более поздним шагом и не связано с этим. Ответ @Reundo правильный, и дополнительные советы, которые они дали, также помогут намекнуть на ввод текста.

4. @Reundo Спасибо за ответ, но это не сработает.

5. @PrasadPatel если вы не изменили имя параметра, то используйте action="{{ route('tasks.update', ['id' => $record->id])