【问题标题】:Execute actions both sync and async执行同步和异步操作
【发布时间】:2019-05-27 12:40:12
【问题描述】:

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

例如,当我想调用发送注册电子邮件操作时,我希望能够这样做:

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

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

【问题讨论】:

  • 我不太明白这个问题。您如何处理异步作业?为什么不为此使用队列?
  • 我不介意使用队列,但正如我所说,我有很多 (40) 个 php 可调用类,我称它们为我的操作,我需要的是能够同步调用这些操作或异步,我不想创建 40 个新类只是为了能够在我的代码库中处理异步。

标签: php laravel asynchronous


【解决方案1】:

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(查看docs 了解更多信息)。

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多