Laravel 8-全局对象在整个应用程序中可用(不仅仅是在视图文件中)



在我的应用程序中,用户可以属于不同的帐户,并在这些帐户上扮演不同的角色。为了确定哪个账户是";当前";我正在authenticated()方法中的LoginController中设置会话变量。

$request->session()->put('account_id', $user->accounts()->first()->id);

然后,在整个应用程序中,我正在进行一个简单的Eloquent查询,以通过ID查找帐户。

而这";作品";,我基本上在每个控制器、中间件等中重复相同的查询。可维护性很差,在Debugbar中显示了重复的查询。

例如,在我正在做的每一个控制器中:

protected $account;
public function __construct()
{
$this->middleware(function($req, $next){
$this->account = Account::find($req->session()->get('account_id'));
return $next($req);
});

}

在自定义中间件和整个应用程序中,我基本上都在做同样的事情——根据会话中存储的ID查找Account。

我知道您可以与所有视图共享变量,但我需要一种与整个应用程序共享的方式。

我想,用auth()->user获取auth用户的方式大致相同。

在拉拉维尔,该怎么做?

我会创建一个类来处理这个逻辑。使它成为一个singleton,以确保它是您正在访问的同一个类。因此,在提供者单例中,您将在一秒钟内创建类。

$this->app->singleton(AccountContext::class);

创建一个类,在那里你可以在上下文中设置帐户并将其取出。

class AccountContext
{
private $account;
public function getAccount()
{
return $this->account;
}
public function setAccount($account)
{
$this->account = $account;
}
}

现在在中间件中设置您的帐户。

$this->middleware(function($req, $next){
resolve(AccountContext::class)->setAccount(Account::find($req->session()->get('account_id')));
return $next($req);
});

在应用程序的任何地方,您现在都可以使用以下代码段访问该帐户。

resolve(AccountContext::class)->getAccount();

相关内容

最新更新