Table of Contents
工作流程自动化是现代软件效率的核心,让团队以清晰和控制的方式协调复杂的业务流程。在拉拉维尔生态系统中,一种经过验证的优雅平衡灵活性和可维护性的方法是构建者模式。 本条为使用Laravel的构建者模式设计工作流程自动化系统提供了深入、实用的指南,从基本原则转向先进的、可操作的操作。
在 Laravel 语境中理解构建器模式
构建器模式是一种将复合对象的构造与其最终表示区分开来的设计模式。构建器模式不是强制一个具有许多参数的单一构建器,而是允许您构建一个对象的步态,使创建过程既可读又灵活。
在工作流程自动化的背景下,“复合对象”是一系列步骤(一个工作流程)的顺序。使用构建器,您可以定义不同构成的工作流程——添加、删除或重排步骤,而不改变基本步骤类别。这种脱钩使系统易于扩展和测试。Laravel开发者在框架的许多部分(如查询构建器、邮件构建器)已经享有流畅、构建器般的API,因此,对工作流程采用相同的哲学是自然的。
主要优点包括:
- 可读性[:链路方法类似于工作流程定义的DSL.
- 可变性:构建的工作流程对象可以执行或坚持,而不会产生副作用.
- 可测试性[:步骤和建造者可以隔离测试.
工作流程系统的核心组成部分
干净的设计需要三个主要抽象:Workflow本身,一个Step接口,以及一个懂得如何将步骤组装成Workflow的构建器.
定义工作流程类别
工作流程班持有一套按顺序排列的步数,并提供了一种执行步骤的方法,它不应关心每个步数的具体细节,而只考虑它们执行确定的合同。
<?php
namespace App\Workflow;
class Workflow
{
protected array $steps = [];
public function addStep(Step $step): self
{
$this->steps[] = $step;
return $this;
}
public function run(): void
{
foreach ($this->steps as $step) {
$step->execute();
}
}
public function getSteps(): array
{
return $this->steps;
}
}
这种最小的操作足以显示这个概念。在真正的Laravel应用程序中,您可以给工作流注入一个或,但即使没有这些,模式仍然很固态。
创建步进界面
参加工作流程的每一步骤都必须执行一个共同的界面。这保证了工作流程可以在任何步骤上调用,而不知道其内部逻辑。
<?php
namespace App\Workflow;
interface Step
{
public function execute(): void;
}
您可以随时间而扩展此接口。 例如, 添加 [[FLT: 5] 或 [[FLT: 6]] , 就可以有条件的执行和类似交易的回滚—— 两者都对生产工作流程有用 。
执行具体步骤
具体步骤进行实际工作。下面是两个共同步骤的例子:发送电子邮件和处理数据。
<?php
namespace App\Workflow\Steps;
use App\Workflow\Step;
use Illuminate\Support\Facades\Mail;
class EmailStep implements Step
{
public function __construct(
private readonly string $recipient,
private readonly string $subject = 'Workflow Notification',
private readonly string $body = ''
) {}
public function execute(): void
{
Mail::raw($this->body, function ($message) {
$message->to($this->recipient)
->subject($this->subject);
});
}
}
class DataProcessingStep implements Step
{
public function __construct(
private readonly array $data
) {}
public function execute(): void
{
// Transform, validate, or persist $this->data
// For demo: log the data
\Log::info('Processing data', $this->data);
}
}
通过保持步骤的细小和重点突出,鼓励跨不同工作流程的重复使用.
执行构建器
构建器类为构建工作流程对象提供了流畅的界面。构建器上的每一种方法都为内部工作流程实例添加了一个配置的步骤,然后返回自己进行链路化。
<?php
namespace App\Workflow;
class WorkflowBuilder
{
protected Workflow $workflow;
public function __construct()
{
$this->workflow = new Workflow();
}
public function addEmailStep(string $recipient, string $subject = 'Notification', string $body = ''): self
{
$this->workflow->addStep(
new Steps\EmailStep($recipient, $subject, $body)
);
return $this;
}
public function addDataProcessingStep(array $data): self
{
$this->workflow->addStep(
new Steps\DataProcessingStep($data)
);
return $this;
}
public function build(): Workflow
{
return $this->workflow;
}
}
流利的接口和链条
流畅的界面是让构建器模式在Laravel中闪耀的源头。开发者可以用单一表达式来编译工作流程 :
$workflow = (new WorkflowBuilder())
->addEmailStep('[email protected]', 'Welcome', 'Your account is ready.')
->addDataProcessingStep(['user_id' => 42, 'action' => 'register'])
->build();
$workflow->run();
这种可读性可以减少认知负荷,并使得在商业规则变化时很容易重新安排步骤。对于更复杂的情景,一个 主任 类可以概括几个预先定义的构建器,例如,该构建器返回一个完整的“构建”工作流程,用于新的用户注册。
高级工作流程特征
生产工作流程系统需要的不仅仅是线性执行。 让我们加强架构,支持有条件的步骤、错误处理和持久性。
使用预测的有条件步骤
并非所有步骤都应当每次运行。通过扩展 Step 接口,使用 ] 方法,您可以根据运行时间数据作出执行决定。
interface Step
{
public function shouldExecute(Context $context): bool;
public function execute(): void;
}
class ConditionalEmailStep implements Step
{
public function shouldExecute(Context $context): bool
{
return $context->get('send_email') === true;
}
public function execute(): void
{
// send email...
}
}
工作流程的方法随后将在执行前检查每一步骤的状况。
处理错误和回滚
当步骤失败时, 您可能想要取消先前完成的步骤( saga 模式) 。 在步骤界面中添加 [[FLT: 14] ] 方法 :
interface Step
{
public function execute(): void;
public function rollback(): void;
}
工作流程随后成为交易管理器:
public function run(): void
{
$completed = [];
try {
foreach ($this->steps as $step) {
$step->execute();
$completed[] = $step;
}
} catch (\Throwable $e) {
// Rollback in reverse order
foreach (array_reverse($completed) as $completedStep) {
$completedStep->rollback();
}
throw $e;
}
}
这种模式对于必须保持数据一致性的多步骤业务,如财务交易或库存调整,特别有价值。
持续工作流动状态
长期运行的工作流程(如用户审批链)需要坚持在请求之间保持状态。 Laravel的口味ORM让这一点变得简单明了。
创建 [[FLT: 17]] 模式,存储步骤列表( 序列化) 和当前执行索引。 使用专用表格 :
Schema::create('workflows', function (Blueprint $table) {
$table->id();
$table->text('steps'); // serialized array of Step objects
$table->unsignedSmallInteger('current_step')->default(0);
$table->string('status'); // pending, running, completed, failed
$table->timestamps();
});
恢复时, Workflow 对象会从存储的序列步骤(或者使用构建器可以重新验证的步定义)中重建。一个步骤可以是 Laravel 工作类,使同步执行本地化 。
与拉拉维尔生态系统的结合
使用工作同步步骤
对于应该在背景中运行的步骤(例如发送大报告),将每个步骤转换为Laravel工作。工作流可以按顺序发送任务,或者构建者可以将一个步骤包在一个工作类中。
class DispatchJobStep implements Step
{
public function __construct(
private readonly object $job
) {}
public function execute(): void
{
dispatch($this->job);
}
}
// Usage in builder
public function addReportGenerationJobStep(int $userId): self
{
$this->workflow->addStep(
new DispatchJobStep(new GenerateReportJob($userId))
);
return $this;
}
广播工作流程进展
实时 UI 更新可以利用 Laravel 的事件广播。 每一个步骤都可以在执行前后发射一个事件 :
public function execute(): void
{
StepStarted::dispatch($this);
// perform work
StepCompleted::dispatch($this);
}
听众然后可以通过WebSockets(使用Laravel Echo)向前端仪表板广播.
真实的世界使用案例
- 用户登机工作流程:创建账户 发送欢迎邮件 指定默认权限 触发机载分析.
- 订单处理工作流程:验证库存 – 收费支付 – 发送订单确认 – 更新运货队列.
- 经常批准工作流程:提交草案 通知审查员 批准/拒绝 公布或送回修订。
在每一种情况下,构建器模式都允许不同的部门在不触及基本执行引擎的情况下定义自己的工作流程组成.
测试工作流程
模式的最大赢家之一是可测试性。每个步骤都可以独立测试。构建者可以用模拟步骤测试步骤,以核实步骤的正确顺序是否组装。整合测试可以使用假的外部服务执行来运行整个工作流程(例如 )。
public function test_email_step_is_added_to_workflow()
{
$builder = new WorkflowBuilder();
$workflow = $builder
->addEmailStep('[email protected]')
->build();
$steps = $workflow->getSteps();
$this->assertCount(1, $steps);
$this->assertInstanceOf(EmailStep::class, $steps[0]);
}
结论
构建器模式是构建Laravel灵活工作流程自动化的自然适合。它促进可读性、可配置性和可测试性代码,而流畅的界面则反映Laravel开发者已经喜爱的优雅。通过有条件的执行、回滚和持久性的扩展模式,可以建立一个系统,从简单的线性动作到复杂、状态的管弦乐。
为了加深你的理解,探索Laravel关于排队和同步工作流程执行活动的正式文件,并审查关于为Guru重新设计设计设计要素的构建模式[。