Laravel Nova Observe не подключается к базе данных арендаторов - PullRequest
1 голос
/ 19 февраля 2020

У меня есть приложение для нескольких арендаторов. В моей системной базе данных есть модели - Пользователь, Биллинг, FrontEnd ... и с помощью политик я могу показывать, скрывать и предотвращать просмотр и действия арендатора.

У каждого арендатора есть база данных с моделями - Член, Событие, элемент ... Я устанавливаю каждую базу данных модели на основе Auth::user()->dbname в методе _construct. Это позволяет мне установить мое имя базы данных для базы данных клиентов для технической поддержки.

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';
        }
    }

Все это работает как запланировано, пока я не добавлю и Наблюдатель для клиентской модели, например Member

Теперь я получаю ошибка при любом вызове Observer.

Попытка получить свойство для необъекта Auth :: user () -> dbname.

Где я должен зарегистрировать Observer? Я пытался AppServiceProvider и NovaServiceProvider.

1 Ответ

0 голосов
/ 20 февраля 2020

Я думаю, что это происходит потому, что наблюдатель создает экземпляр вашей пользовательской модели до того, как начался цикл запроса, и это означает, что ваш экземпляр 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';
    }
}

Помощник optional возвращает значение доступного свойства (dbname в вашем случае), если и только если аргумент не равен NULL, в противном случае весь вызов вернет нулевое значение, вместо этого будет выдано исключение.

Если это не так, возможно, обновите вопрос с помощью стека ошибок и кода / действия, которое вызывает ошибка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...