php - 执行同步和异步操作
问题描述
在 laravel 5.7 中,我希望能够执行多个操作,例如在数据库中插入用户、发送注册电子邮件、发送通知……我希望能够同步和异步执行这些操作。问题是我不想为每个动作创建 Job 类。每个动作都是一个 php 可调用类。我在 Laravel Job 类中不明白的是它接收依赖项作为处理方法参数并接收它应该处理的输入,在构造函数中,我认为这有点奇怪。
例如,当我想调用发送注册电子邮件操作时,我希望能够执行以下操作:
$registerEmailAction->__invoke($user, true);
第二个参数表示这个动作是同步还是异步。
解决方案
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
路线。您可能还需要使用一些特征,例如SerializeeModels
或Dispatchable
(查看文档以获取更多信息)。
推荐阅读
- c - 如何在循环中声明分配的数组?
- visual-studio - Visual Studio Code - 无法上传在我的计算机上本地创建的 nuget 包
- python - 如何在 python 中的 SQL 中使用列名编写表输出?
- api - amadeus api where if 所有 cityCodes 的列表
- python - Python SQL - 两个左连接
- android - 从左到右为 ImageView 设置动画 - 使用 100%p 从右侧剪辑
- javascript - 有没有办法通过 chrome 扩展将文件直接保存到本地硬盘
- asp.net-core - 传入错误的枚举值时,如何在 ASP.NET Core 中获取自定义 ModelState 错误消息?
- angular - 用Angular 8函数替换链式过滤器/订单管道
- python - 如何将 oseti 中的情绪值附加到 pandas 数据框?