Выполнять действия как синхронно, так и асинхронно

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

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

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

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

Я не очень хорошо понимаю вопрос. Как вы справляетесь с асинхронными заданиями? Почему бы не использовать для этого очереди?

Mozammil 30.12.2018 18:50

Я не против использования очередей, но, как я уже сказал, у меня есть много (40) вызываемых классов php, которые я называю своими действиями, и мне нужно иметь возможность вызывать эти действия синхронно или асинхронно, а я не хочу создать 40 новых классов, чтобы иметь возможность обрабатывать асинхронность в моей кодовой базе.

mhndev 30.12.2018 21:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
139
1

Ответы 1

Классы 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 (дополнительную информацию см. В документы).

Другие вопросы по теме