为什么put方法中设置的参数没有传递?

Why parameter set in put method is not passed?

运行 使用 sanctum id 参数激活方法 我看到 id 参数未传递到激活控制操作中。 在 routes/api.php 中:

Route::middleware('auth:sanctum')->group( function () {
    Route::post('logout', [AuthController::class, 'logout']);
    Route::resource('ads', AdController::class);
    Route::put('ads/{id}/activate', [AdController::class, 'activate']); 
});

在邮递员中我将参数作为http://server.com/api/ads/7/activate传递, 但问题是 app/Http/Controllers/API/AdController.php :

public function activate(Request $request, Ad $ad)
{
    \Log::info(varDump($ad->id, ' -1 activate $ad->id::')); // this parameter is null - and error next :
    ...
} // public function activate(Ad $ad)

在LaravelTelescope我看到详情了:

Request Details
Time    November 26th 2021, 5:08:08 PM (1:46m ago)
Hostname    master-laptop
Method  PUT
Controller Action   App\Http\Controllers\API\AdController@activate
Middleware  api, auth:sanctum
Path    /api/ads/7/activate
Status  500
Duration    113 ms
IP Address  127.0.0.1
Memory usage    2 MB
Tags    Auth:10

为什么id参数错误?

    "laravel/framework": "^8.26.1",
    "laravel/sanctum": "^2.8",

提前致谢!

您需要使用路由绑定您需要将 {id} 替换为 {ad}

Route::put('ads/{ad}/activate', [AdController::class, 'activate']);

如果您的问题仍未解决,您可以手动解决。 将此代码添加到 RouteServiceProvider

boot 方法
Route::model('ad', Ad::class);

如评论中所述,要使 Implicit binding 正常工作,路由中的 uri 段必须与方法的参数(变量)名称匹配,即

{id}更改为{ad},使其与activate方法的$ad参数匹配:

Route::put('ads/{ad}/activate', [AdController::class, 'activate']);