隐式路由模型绑定返回包中的空模型



我正在构建一个封装rest api的laravel包,并且在隐式路由模型绑定方面遇到了一些问题。当我试图检索单个记录时,得到的只是一个空数组。我试图检索的id存在于数据库中(它是表中唯一的记录)使用debugbar,它看起来没有运行查询,这意味着路由绑定在有机会运行之前就失败了(更多信息在底部)。

api.php:

Route::apiResources([
'trackers' => TrackerController::class,
'tracker/entry' => TrackerEntryController::class,
'tracker/types' => TrackerTypeController::class
]);

相关工艺路线:列表输出:

| Method    | URI                   | Middleware |
+-----------+-----------------------+------------+
| GET|HEAD  | tracker/entry/{entry} |            |
| GET|HEAD  | tracker/types/{type}  |            |
| GET|HEAD  | trackers/{tracker}    |            |
+-----------+-----------------------+------------+

从TrackerTypeController显示方法:

use OxthornTrackersModelsTrackerType as Type;
public function show(Type $type)
{
return $type;
}

因此,就我所见,我的代码使用正确的命名方案进行隐式路由绑定。

如果我将控制器显示方法更改为:

public function show(Type $type, $id)
{
$type2 = Type::findOrFail($id);
return [
[get_class($type), $type->exists, $type],
[get_class($type2), $type2->exists],
];
}

我得到这个输出:

[
[
"Oxthorn\Trackers\Models\TrackerType",
false,
[]
],
[
"Oxthorn\Trackers\Models\TrackerType",
true
]
]

这似乎模仿了这个StackOverflow问题中的行为:隐式路由模型绑定,上次发布的理论是SubstituteBindings中间件没有运行。在这一点上,我不确定我需要采取什么步骤来确保它在代码执行之前运行,所以我在这里寻求建议。

你知道,在一个问题上睡觉会产生奇迹。对于任何在开发包时遇到同样问题的人,我必须将我的路线代码更改为以下代码来解决问题:

Route::apiResource('trackers', TrackerController::class)->middleware('bindings');
Route::apiResource('tracker/entry', TrackerEntryController::class)->middleware('bindings');
Route::apiResource('tracker/types', TrackerTypeController::class)->middleware('bindings');

最新更新