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

时间:2018-12-30 04:34:54

标签: laravel

我正在构建一个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中间件未运行。我现在不确定在执行代码之前需要采取什么步骤来确保其运行,所以我在这里寻求有关从此处出发的建议。

1 个答案:

答案 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');