我有2个模型:用户和帐户。
帐户是公司帐户,它具有一个slug
字段。需要Slug来确定用户正在访问哪个公司。例如,路线/account/*company_slug*/deals
表示用户试图获取 company_slug 公司的一系列交易。
与公司关联的每个实体都有一个字段account_id
。这就是为什么我需要获得当前帐户的原因。我应该在哪里做以及如何做?
在示例中,我使用以下代码获取了中间件CheckIfAccountAcceptedForUser
:
public function handle($request, Closure $next)
{
$account = Account::find($request->route()->parameter('account'));
abort_if(empty($account), 404) ;
abort_if(DB::table('account_user')
->where(function (Builder $query) use ($account) {
$query->where('account_slug', '=', $account->slug);
$query->where('user_id', '=', Auth::id());
})
->get()
->isEmpty(), 403);
return $next($request);
}
如果路由类似于/account/*account*/...
,如何为我的应用程序全局设置account_id?
答案 0 :(得分:0)
也许这不是您想要的。
当您在中间件中检查帐户时,您将进行查询,此后,您应在控制器中进行一个新查询以获取帐户数据。根据您的情况,您要查询3个查询,而不是1个。
您可以通过一个查询在帐户控制器中对其进行检查。
路线:
Route::get('/account/{slug}/deals', 'AccountsController@deals');
帐户控制器:
public function deals($slug){
$account = Account::where('id', Auth::user()->account_id)
->where('slug', $slug)
->firstOrFail();
$deals = Deal::where('account_id', $account->id)->get();
return view('account.deals', compact('account', 'deals'));
}
如果不存在当前子帐户或用户无法访问此帐户,它将始终响应404错误。您真的需要403响应吗?
答案 1 :(得分:0)
public function handle($request, Closure $next)
{
$account = Account::find($request->route()->parameter('account'));
abort_if(empty($account), 404) ;
abort_if(DB::table('account_user')
->where(function (Builder $query) use ($account) {
$query->where('account_slug', '=', $account->slug);
$query->where('user_id', '=', Auth::id());
})
->get()
->isEmpty(), 403);
//For global use in your all view file
View::share ( 'account_id', $account->id);
// to access account_id in controller
$request->request->add(['account_id' => $account->id]);
return $next($request);
}
在控制器中
$account_id = request('account_id');