#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 автоматически разрешает красноречивые модели, определенные в маршрутах или действиях контроллера, имена переменных типа которых соответствуют имени сегмента маршрута.
В своем коде вы должны изменить это
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])