В laravel 5.7 я хочу иметь возможность иметь несколько действий, например, добавление пользователя в базу данных, отправка регистрационного электронного письма, отправка уведомления, ... Я хочу иметь возможность выполнять эти действия как синхронно, так и асинхронно. проблема в том, что я не хочу создавать класс Job для каждого действия. каждое действие - это вызываемый класс php. То, что я не понимаю в классе Laravel Job, - это то, что он получает зависимости как аргументы метода дескриптора и получает свой ввод, который должен обрабатываться в конструкторе, я думаю, что это немного странно.
например, когда я хочу вызвать действие по отправке регистрации по электронной почте, я хочу иметь возможность делать что-то вроде:
$registerEmailAction->__invoke($user, true);
Второй параметр указывает, следует ли выполнять это действие синхронно или асинхронно.
Я не против использования очередей, но, как я уже сказал, у меня есть много (40) вызываемых классов php, которые я называю своими действиями, и мне нужно иметь возможность вызывать эти действия синхронно или асинхронно, а я не хочу создать 40 новых классов, чтобы иметь возможность обрабатывать асинхронность в моей кодовой базе.






Классы Laravel Job - это простые объекты, которые должны реализовывать только интерфейс 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 (дополнительную информацию см. В документы).
Я не очень хорошо понимаю вопрос. Как вы справляетесь с асинхронными заданиями? Почему бы не использовать для этого очереди?