我正在构建一个laravel包,其中封装了一个rest api,并且我遇到了隐式路由模型绑定的一些问题。当我尝试检索单个记录时,我得到的只是一个空数组。我正在尝试检索的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 Oxthorn\Trackers\Models\TrackerType as Type;
public function show(Type $type)
{
return $type;
}
据我所知,我的代码使用正确的命名方案进行隐式路由绑定。
如果我将控制器show方法更改为此:
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问题:Implicit Route Model Binding中的行为,最近发布的理论是SubstituteBindings
中间件未运行。我现在不确定在执行代码之前需要采取什么步骤来确保其运行,所以我在这里寻求有关从此处出发的建议。
答案 0 :(得分:1)
你知道,睡在一个问题上确实很神奇。对于开发软件包时遇到相同问题的任何人,我都必须更改其路由代码以解决该问题:
Route::apiResource('trackers', TrackerController::class)->middleware('bindings');
Route::apiResource('tracker/entry', TrackerEntryController::class)->middleware('bindings');
Route::apiResource('tracker/types', TrackerTypeController::class)->middleware('bindings');