尽管设置正确,控制器仍无法访问模型 ID。我使用 Laravel 10 来实现此 REST API

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

当我尝试在 JSController 的 show 方法中访问模型 (JenisSurvey) 的 ID 时,即使模型已正确检索,该 ID 始终为 null。有趣的是,我的应用程序中有其他控制器,类似的操作可以完美地工作。例如,如果我在不同的控制器中使用用户模型,我可以毫无问题地访问 ID。

我已经检查了路由配置、模型绑定、自动加载文件、控制器逻辑以及数据库中存在搜索到的 ID 的数据。一切似乎都井井有条,逻辑反映了其他类似操作的控制器的逻辑。

这是 JSController 中 show 方法的简化版本:

public function show(JenisSurvey $jenisSurvey)
{
    dd($jenisSurvey->id); // This always returns null

    if (!$jenisSurvey) {
        return response()->json(['error' => 'Data not found.'], 404);
    }
    return new JSResource($jenisSurvey);
}

有趣的是,我的应用程序中有其他控制器,类似的操作可以完美地工作。例如,如果我在不同的控制器 (UserController) 中使用 User 模型,我可以毫无问题地访问 ID。这是 UserController 中 show 方法的简化版本,用于比较:

public function show(User $user)
{
    dd($user->id); // This returns the correct ID
    return new UserResource($user);
}

此外,当我将 UserController 中的模型和资源切换到 JenisSurvey 时,它按预期工作。

// UserController but with jenis survey model and resource
public function show(JenisSurvey $user)
{
    dd($user->id); // This returns the correct ID
    return new JSResource($user);
}

路线如下:

Route::group(['namespace' => 'App\Http\Controllers', 'middleware' => 'auth:sanctum'],function () {
    Route::apiResource('users', UserController::class)->middleware(['auth','verified','role:admin']);
    Route::apiResource('js', JSController::class)->middleware(['auth','verified','role:admin|nasabah']);
});

下面是截图。

JSController(Jenis Survey 控制器):

UserController 使用用户的模型和资源:

使用 JenisSurvey 模型和资源的 UserController:

JSController(var 转储整个模型):

照片

UserController(带有 Jenis Survey 模型和资源):

照片

鉴于该问题似乎特定于 JSController (Jenis Survey Controller) 文件,我怀疑其设置或环境可能有一些独特之处。任何有关如何进一步解决此问题的见解或建议将不胜感激。

php laravel rest laravel-10
1个回答
0
投票

当您提供给资源路由构建器的所有内容都是

jenisSurvey
时,您不应假设资源名称为
js

通过快速测试 L10:

Route::apiResource('js', TestController::class);

php artisan route:list --path=api/js
显示:

GET|HEAD    api/js .................... js.index
POST        api/js .................... js.store
GET|HEAD    api/js/{j} ................ js.show
PUT|PATCH   api/js/{j} ................ js.update
DELETE      api/js/{j} ................ js.destroy

因此控制器中的资源将被称为

$j

如果你想保持相同的路由结构,你可以覆盖路由声明中自动生成的名称

Route::apiResource('js', TestController::class)->parameter('js', 'jenisSurvey');
© www.soinside.com 2019 - 2024. All rights reserved.