Я столкнулся с проблемой маршрутизации Laravel в моем приложении. В частности, я получаю следующую ошибку:
Internal Server Error
Illuminate\Routing\Exceptions\UrlGenerationException
Missing required parameter for [Route: edit_mahasiswa] [URI: mahasiswa/edit/{id}] [Missing parameter: id].
У меня есть маршрут для редактирования объекта Махасисва:
route::group(['middleware' => ['auth:user']], function () {
Route::get('/mahasiswa/edit/{id}', [MahasiswaController::class, 'edit'])->name('edit_mahasiswa');
}
Это мой контроллер
public function edit($id) {
//dd($id);
$mahasiswa = Mahasiswa::find($id);
if ($mahasiswa) {
return view('mahasiswa.edit', compact('mahasiswa'));
} else {
Alert::error('Mahasiswa tidak ditemukan');
return redirect()->route('daftar_mahasiswa')->with('error', 'Mahasiswa tidak ditemukan');
}
}
На мой взгляд, когда я перечисляю сущности Махасисвы, я пытаюсь создать URL-адрес для редактирования сущности:
@foreach ($mahasiswa as $m)
<tr>
<th scope = "row">{{ $m->id }}</th>
<td>{{ $m->nim }}</td>
<td>{{ $m->name }}</td>
<td>{{ $m->email }}</td>
<td>
<a href = "{{ route('edit_mahasiswa', ['id' => $m->id]) }}">
<button class = "btn btn-warning">
<i class = "ri-edit-2-fill"></i>
</button>
</a>
</td>
</tr>
@endforeach
Однако я получаю сообщение об ошибке:
Missing required parameter for [Route: edit_mahasiswa] [URI: mahasiswa/edit/{id}] [Missing parameter: id].
Что я пробовал:
Можете ли вы указать, как вы получили доступ к этому маршруту edit_mahasiswa. ?Поскольку это UrlGenerationException, существует вероятность того, чтоid не был передан должным образом при доступе к этому маршруту.
когда я подключаюсь к своему контроллеру, он работает, но если я запускаю свой код, чтобы вернуть представление, отсутствует параметр
Я проверил, что $m->id передается правильно, используя dd() в методе контроллера. Вывод подтверждает, что идентификатор получен.
Несмотря на эти шаги, я по-прежнему сталкиваюсь с ошибкой UrlGenerationException, указывающей на отсутствие параметра id при попытке создать URL-адрес для маршрута edit_mahasiswa.
«с помощью dd()» — dd() не является надежным способом отладки цикла... Вы делаете foreach(), поэтому dd($m->id) покажет вам только id первого экземпляра $m. Если да ['id' => $m->id ?? 1], ваш код работает? Если да, то один или несколько экземпляров $m не имеют свойства id, а ['id' => null] недопустимо, и вам нужно обработать это.
«На мой взгляд, я перечисляю сущности Махасисвы» — покажите этот код; Я предполагаю, что вы запрашиваете в своей БД записи Mahasiswa, затем передаете их этому представлению и зацикливаете их через foreach(). Не должно быть причины $m->id есть null, поскольку для записей БД нужен первичный ключ, который, как я предполагаю, равен id... Но да, здесь вам не хватает важного фрагмента кода, который нам нужно увидеть, чтобы помочь в дальнейшем.






Проблема, вероятно, в том, что $m->id возвращается в null и передает значение null в обязательный параметр. Вы можете проверить это, просто передав null статически и передав целочисленное значение.
<a href = "{{ route('edit_mahasiswa', ['id' => null]) }}">Button</a> //for error
<a href = "{{ route('edit_mahasiswa', ['id' => 1]) }}">Button</a> // for correct results
Вы можете исправить это, убедившись, что $m->id никогда не является null, или сделать параметр необязательным с помощью {id?}.
Route::get('/mahasiswa/edit/{id?}', [MahasiswaController::class, 'edit'])-`>name('edit_mahasiswa');`
Но затем обязательно обработайте нулевой случай в своем контроллере.
спасибо за ответ, как мне обращаться со своим контроллером, чтобы он работал, извините за мой плохой английский
Вы можете просто присвоить переменной $id значение по умолчанию.
public function edit($id = 0) { //your code }или просто присвойте ему нулевое значение по умолчанию public function edit($id = 0) { //your code }
спасибо, работает, использовал {id?}
Вам следует серьезно разобраться, почему $m->id является null... Если вы пытаетесь редактировать записи базы данных, все они должны иметь id, поскольку это должен быть первичный ключ. {id?} делает свойство необязательным на этом маршруте, поэтому вы можете перейти к /mahasiswa/edit или mahasiswa/edit/1, но первый маршрут не имеет смысла... Какую запись вы пытаетесь редактировать, если не передаете идентификатор? Это пластырь для решения более серьезной проблемы с вашим кодом.
Вам не нужно указывать свой идентификатор в виде массива. Просто укажите свой идентификатор вот так
<a href = "{{ route('edit_mahasiswa', $m->id) }}">
вы уверены, что
$m->idв некоторых случаях не дает вам NULL?