Я столкнулся с проблемой маршрутизации 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?