我正在构建一个封装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');