一个常见的问题是“缺少路由所需的参数”,但我有一个稍微不同的问题,我根本找不到解决方案:
以下是我的相关路线:
Route::get('/monitoring/{monitoring}/edit', [HistoryController::class, 'edit'])->name('monitoring.edit');
Route::patch('/monitoring/{monitoring}', [HistoryController::class, 'update'])->name('monitoring.update');
根据laravel文档通常的更新路线
这是控制器所需的部分:
public function edit(History $history) {
return view('monitoring.edit', compact('history'));
}
public function update(History $history, Request $request) {
$data = $request->validate([
'blablabla1' => 'integer',
'blablabla2' => 'string',
'blablabla3' => 'string',
'blablabla4' => 'string',
]);
dd($data);
}
和景色:
<form class="container" action="{{route('monitoring.update', $history)}}" method="post">
@csrf
@method('patch')
...
我没有发明任何东西,我只是“遵循教科书”,但是当没有参数时我会收到一个错误 - 在我的例子中,参数被明确指出。怎么了?
编辑: 有日志 - https://flareapp.io/share/x5MwLdDP
我的所有路线:
Route::get('/monitoring', [HistoryController::class, 'index'])->name('monitoring.index');
Route::get('/monitoring/create', [HistoryController::class, 'create'])->name('monitoring.create');
Route::get('/monitoring/{monitoring}/edit', [HistoryController::class, 'edit'])->name('monitoring.edit');
Route::patch('/monitoring/{monitoring}', [HistoryController::class, 'update'])->name('monitoring.update');
Route::get('/monitoring/deleting', [HistoryController::class, 'deleteData'])->name('monitoring.deleteData');
Route::post('/monitoring', [HistoryController::class, 'store'])->name('monitoring.store');
Route::get('/monitoring/sending', [HistoryController::class, 'setData']);
Route::get('/monitoring/updating', [HistoryController::class, 'updateData']);
Route::get('/monitoring/{monitoring}', [HistoryController::class, 'show'])->name('monitoring.show');
控制器/刀片中的 dd($history):
#connection: null
#table: "histories"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
+preventsLazyLoading: false
#perPage: 15
+exists: false
+wasRecentlyCreated: false
#escapeWhenCastingToString: false
#attributes: []
#original: []
#changes: []
#casts: array:1 [▼
"deleted_at" => "datetime"
]
#classCastCache: []
#attributeCastCache: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
+usesUniqueIds: false
#hidden: []
#visible: []
#fillable: []
#guarded: []
#forceDeleting: false
}
“显示”中的按钮,带有编辑“任何帖子”的链接:
<div class="dropdown position-fixed bottom-0 end-0 mb-3 me-3 bd-mode-toggle">
<div class="container">
<p class="float-end mb-1">
<a href="{history}/edit"><button type="submit" class="btn btn-dark" style="margin-top:20px;">Изменить</button></a>
</p>
</div>
</div>
你应该
Laravel 自动解析路由或控制器操作中定义的 Eloquent 模型,其类型提示变量名称与路由段名称匹配。
在这里您可以尝试两件事。
方法一:
您可以将路线更新为
Route::get('/monitoring/{history}/edit', [HistoryController::class, 'edit'])->name('monitoring.edit');
Route::patch('/monitoring/{history}', [HistoryController::class, 'update'])->name('monitoring.update');
方法2: 您可以在控制器中重命名变量
public function edit(History $monitoring) {
return view('monitoring.edit', compact('monitoring'));
}
public function update(History $monitoring, Request $request) {
$data = $request->validate([
'blablabla1' => 'integer',
'blablabla2' => 'string',
'blablabla3' => 'string',
'blablabla4' => 'string',
]);
dd($data);
}
我希望它有帮助。另外,请确保没有重复的路线,您忘了提及。