我有一个多租户应用程序。我的系统数据库有模型-用户,帐单,前端...,并使用我可以显示,隐藏和阻止租户查看和操作的策略。
每个租户都有一个包含模型的数据库-成员,事件,项目...我基于Auth::user()->dbname
方法中的_construct
设置每个模型数据库。这使我可以将dbname设置为clients数据库以获得技术支持。
class Item extendsw Model {
public function __construct() {
parent::__construct();
if(Auth::user()->dbname) {
Config::set('database.connections.tenant.database', auth()->user()->dbname);
$this->connection = 'tenant';
}
}
这一切都按计划进行,直到我为客户端模型添加和观察者,例如会员
我现在在任何观察者调用上都出错。
试图获取非对象Auth :: user()-> dbname的属性。
我应该在哪里注册观察员?我尝试了AppServiceProvider
和NovaServiceProvider
。
我认为发生这种情况是因为观察者在请求周期开始之前实例化了您的User模型,这意味着您的User
实例不存在,但尚未在Auth外观中进行绑定。
因此,Auth::user()
返回null
,而您正试图从中获取属性。解决此问题的方法可能是检查用户实例是否存在:
public function __construct() {
parent::__construct();
if (optional(Auth::user())->dbname !== null) {
Config::set('database.connections.tenant.database', auth()->user()->dbname);
$this->connection = 'tenant';
}
}
[且仅当参数不为null时,optional
助手才会返回所访问属性的值(在您的情况下为dbname
),否则整个调用将返回null值,而不是引发异常。
如果不是这种情况,请使用错误堆栈跟踪和触发错误的代码/操作来更新问题