【问题标题】:How to get computed variable from any model and controller in laravel?如何从 laravel 中的任何模型和控制器中获取计算变量?
【发布时间】:2018-12-13 20:34:35
【问题描述】:

我有 2 个模型:UserAccount

Account 是一个公司帐户,它有一个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?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    也许这不是您想要的。

    当您在中间件中检查帐户时,您会进行查询,之后您应该在控制器中进行新的查询以获取帐户数据。在您的情况下,您进行 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'));
    }
    

    如果当前 slug 的帐户不存在或用户无法访问此帐户,它将始终响应 404 错误。你真的需要 403 响应吗?

    【讨论】:

      【解决方案2】:
      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');
      

      【讨论】:

        猜你喜欢
        • 2020-05-08
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多