我想知道是否可以执行与路由模型绑定类似的操作,但需要使用请求标头。我有一个查询我检查我的api端点,看起来像这样:
User::where('telephone', $request->header('x-user'))->firstOrFail();
是否有可能以某种方式避免在控制器中的每个方法中重复此查询,而是将其应用于路由,这样我就可以获得用户对象,就像在路径模型中绑定函数中的类型提示一样在api routes文件夹中的路由:
public function userTransactions(User $user)
{
//
}
答案 0 :(得分:0)
创建中间件并将其分配给所需的路由。
选项1
在你的中间件中:
$user = User::where('telephone', $request->header('x-user'))->firstOrFail();
request()->merge(['user_model' => $user]);
然后您可以在控制器的任何位置request()->get('user_model')
选项2
首先创建符合查询的全局范围类。在这里,您将获得标头值并在范围内使用它。
https://laravel.com/docs/5.5/eloquent#global-scopes
接下来在中间件中,使用addGlobalScope
User::addGlobalScope(new HeaderScope())
现在,对User的所有查询都会有一个带有标题值的where子句。
如果需要,您可以随后删除范围或忽略全局范围。