【问题标题】:Missing required parameter for [Route: tasks.update] [URI: tasks/{task}] [Missing parameter: task][Route: tasks.update] [URI: tasks/{task}] [Missing parameter: task] 缺少必需参数
【发布时间】:2023-09-27 16:39:01
【问题描述】:

我正在使用 laravel 8 进行编辑操作,为此我使用 php artisan 命令创建了资源控制器,并且创建工作完美,但编辑操作无法正常工作,给出错误为“缺少 [Route:tasks.update 所需的参数” ] [URI:tasks/{task}] [缺少参数:task]'

web.php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TaskController;

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)
{
   
}

任何帮助,谢谢。

【问题讨论】:

  • 您需要通过初始化刀片路由操作中的参数来传递ID(在这种情况下为任务主键)。 Official documentation on resource routes。您可以使用{{ route('tasks.edit', ['task' =&gt; $record-&gt;id]}} 传递您的参数,更新路由也可以采用同样的方式。
  • 也许可以试试checking the routing docs

标签: php laravel laravel-8 crud


【解决方案1】:

在你的表单中改变这个

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

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

还有一个建议:

Laravel Docs:

Laravel 自动解析定义在路由或控制器操作中的 Eloquent 模型,其类型提示的变量名称与路由段名称匹配。

在你的代码中你应该改变这个

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]);
}

如果您不想绑定模型,请从参数中删除“任务”。

【讨论】:

  • 虽然这是个好建议,但类型提示建议与 OP 的实际错误无关。 route() 更新是修复错误所需的全部内容。
  • @Don'tPanic 嗯,你是对的。我更新了答案。
  • @CornelRaiu 正如我的第一条评论所说,OP 的错误与类型提示无关。资源路由将参数命名为{task},因此route() 助手需要task,因为错误消息确认:“缺少参数:任务”。控制器中发生的事情是稍后的步骤,并且不相关。 @Reundo 的回答是正确的,而且他们提供的额外建议也会让类型提示起作用。
  • @Reundo 谢谢你的回答,但它不起作用。
  • @PrasadPatel 如果您没有更改参数名称,请使用action="{{ route('tasks.update', ['id' =&gt; $record-&gt;id])