首页 > 解决方案 > 执行同步和异步操作

问题描述

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

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

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

第二个参数表示这个动作是同步还是异步。

标签: phplaravelasynchronous

解决方案


Laravel Job 类是简单的对象,只需要实现ShouldQueue接口和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(查看文档以获取更多信息)。


推荐阅读