如何从laravel中的任何模型和控制器获取计算变量?

时间:2018-12-13 12:02:25

标签: php laravel

我有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?

2 个答案:

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