Выполнять действия как синхронно, так и асинхронно - PullRequest
0 голосов
/ 30 декабря 2018

В laravel 5.7 я хочу иметь возможность выполнять несколько действий, например, вставлять пользователя в базу данных, отправлять электронную почту регистрации, отправлять уведомления, ... Я хочу иметь возможность выполнять эти действия как синхронно, так и асинхронно.проблема в том, что я не хочу создавать класс Job для каждого действия.каждое действие - класс, вызываемый php.То, чего я не понимаю в классе Laravel Job, это то, что он получает зависимости как аргументы метода дескриптора и получает свой Input, который должен обрабатываться, в конструкторе, я думаю, это немного странно.

например, когда я хочучтобы вызвать действие отправки по электронной почте, я хочу иметь возможность выполнять следующие действия:

$registerEmailAction->__invoke($user, true);

Второй параметр указывает, выполнять ли это действие - синхронизация или асинхронность.

1 Ответ

0 голосов
/ 31 декабря 2018

Классы заданий Laravel - это простые объекты, для реализации которых требуется только интерфейс ShouldQueue и метод handle().Вы можете отправить их или сразу запустить их, явно вызвав метод handle.Если вы хотите выбрать маршрут __invoke, вы можете сделать что-то вроде этого:

class RegisterEmailAction implements ShouldQueue
{
    //... more code ...

    public function __invoke(User $user, bool $async)
    {
        $this->setUser($user);
        if ($async) {
            dispatch($this);
        }
        else {
            $this->handle(); // or dispatch_now($this);
        }
    }

    public function handle()
    {
        if (!$this->user) {
            throw new UserNotFoundException();
    }
        //  ... some other code ...
    }
}

Поскольку вы не хотите передавать $ user в качестве зависимости в конструкторе, я бы предложил проверитьэто в методе handle, так что вы получите ошибку, если некоторый клиентский код попытается вызвать метод handle, не используя маршрут __invoke.Вам также может понадобиться использовать некоторые черты, такие как SerializeeModels или Dispatchable (проверьте документы для получения дополнительной информации).

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