执行同步和异步动作

时间:2018-12-30 17:05:35

标签: php laravel asynchronous

在laravel 5.7中,我希望能够执行多个操作, 例如在数据库中插入用户,发送注册电子邮件, 正在发送通知,... 我希望能够同时执行同步和异步这些操作。 问题是我不想为每个动作创建Job类。 每个动作都是一个php可调用类。 我在Laravel Job类中不了解的事情是,它接收依赖项作为句柄方法参数,并接收应处理的Input,在构造函数中,我认为这很奇怪。

例如,当我想调用“发送注册电子邮件”操作时,我希望能够执行以下操作:

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

第二个参数指示该操作是同步还是异步。

1 个答案:

答案 0 :(得分:0)

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路线。您可能还需要使用某些特征,例如SerializeeModelsDispatchable(请查看docs以获取更多信息)。