缺少路由所需参数(不是标准问题)

问题描述 投票:0回答:1

一个常见的问题是“缺少路由所需的参数”,但我有一个稍微不同的问题,我根本找不到解决方案:

以下是我的相关路线:

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>
php laravel laravel-blade
1个回答
2
投票

你应该

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

我希望它有帮助。另外,请确保没有重复的路线,您忘了提及。

© www.soinside.com 2019 - 2024. All rights reserved.