Запуск очереди от имени пользователя

В приложении на laravel 5.8 при обработке задачи из очереди возникает необходимость получить аутентифицированного пользователя auth()->user(), который во время запуска очереди отсутствует (null).

Подробности:

1 Некий юзер инициирует процесс импорта вызовом метода Import\ImportController@init;

2 В этом методе проверяется и парсится переданный файл import.csv, для каждой строки которого в очередь отправляется задача обработки строки; Задания ресурсоёмкие, т.к. выполняют обработку изображений: ресайз и наложение водяных знаков;

3 По окончанию обработки файла пользователю выдается сообщение об успешности постановки заданий в очередь;

4 После обработки изображений в заданиях происходит сохранение моделей в базу данных;

5 В процессе сохранения модели в методе creating() обсервера вызывается метод setCreator(), устанавливаюций параметр creator_id, использующий хелпер auth():

 /**
 * set setCreator from auth user
 *
 * @return $this
 */
public function setCreator(): self
{
    $this->creator_id = auth()->user();
    return $this;
}

6 Модель, естесственно, можно сохранить и с помощью метода ModelController@store - там хелпер отрабатывает как надо.

7 Подробности несколько упрощены и передача текущего пользователя в задачу мне показалась излишне громоздкой. В данный момент вбил костыль: постановка очереди регистрируется в логах, а creator_id ставлю system_user, но заказчиком было озвучено, что в этом поле должен быть id именно инициатора импорта.

В тестах можно воспользоваться $this->actingAs($user), а как решить проблему в очередях?

Есть ли способ запустить задачу из очереди под определенным пользователем?


Ответы (3 шт):

Автор решения: Bohdan Petrenko

вы можете легко в очередь передавать id пользователя, и уже в самой очереди доставать пользователя из репозитория. Либо передавать саму модель пользователя, тут уже как пожелаете

→ Ссылка
Автор решения: Yakoffka

Большое спасибо всем откликнувшимся, но, к сожалению, предложенные варианты решают лишь малую часть вопроса. Полностью решить проблему невозможно. Вопрос закрыт

→ Ссылка
Автор решения: Yakoffka

Нашел решение (как неожиданно!) в мануале.

Правда с небольшим отличием:

производится не запуск очереди от имени пользователя, а непосредственно при выполнении метода handle() происходит аутентификация необходимого пользователя по переданному id:

public function handle(): void
{
    Auth::loginUsingId($this->initiatorId);

    // теперь можно воспользоваться auth()->user()
}

что, впрочем, и требовалось, судя по описанию вопроса.

Надеюсь кому-то пригодится.

→ Ссылка