【问题标题】:Why parameter set in put method is not passed?为什么put方法中设置的参数没有传递?
【发布时间】:2022-01-04 15:28:59
【问题描述】:

使用 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)

在 Laravel 望远镜中我看到了细节:

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",

提前致谢!

【问题讨论】:

  • 如果你希望隐式路由模型绑定发生,方法签名中的参数名称必须与路由参数名称匹配
  • 以下是否回答了您的问题?如果是这样,请您将其标记为已接受:)

标签: laravel postman


【解决方案1】:

如 cmets 中所述,要让 Implicit binding 工作路由中的 uri 段必须匹配方法的参数(变量)名称,即

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

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

【讨论】:

    【解决方案2】:

    你需要使用路由绑定你需要将{id}替换成{ad}

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

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

    Route::model('ad', Ad::class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2015-08-07
      相关资源
      最近更新 更多