Table of Contents
Trong hệ thống sinh thái Laravel, một cách tiếp cận được chứng minh là giữ thăng bằng và duy trì sự linh hoạt là mô hình xây dựng. bài này cung cấp một hướng dẫn sâu sắc, thực tiễn để thiết kế một hệ thống tự động xử lý ở Laravel, di chuyển từ nguyên tắc cơ bản đến việc phát triển, sẵn sàng thực hiện.
Hiểu gương mẫu của người xây cất trong một văn cảnh Laravel
Người xây dựng là một mẫu thiết kế tạo ra phân chia cấu trúc của một vật thể phức tạp với biểu tượng cuối cùng của nó. thay vì ép buộc một người xây dựng với nhiều tham số, người xây dựng cho phép bạn xây dựng một bước bước bằng cách bước chân, làm cho quá trình tạo ra cả khả năng đọc và linh hoạt.
Trong bối cảnh của việc tự động hóa, “vật thể phức tạp là một chuỗi các bước (một dòng) làm việc, sử dụng một nhà xây dựng, bạn có thể xác định dòng tác phẩm khác nhau -- thêm, loại bỏ, hoặc sắp xếp lại các bước -- không thay đổi các lớp bước cơ bản, vì thế việc phân tách này làm cho hệ thống dễ dàng mở rộng và thử nghiệm.
Lợi thế chính bao gồm:
- Sẵn sàng ) Phương pháp xích giống như một DSL để định nghĩa dòng chảy công việc.
- Đối tượng được xây dựng có thể được thực hiện hoặc tiếp tục mà không có tác dụng phụ.
- Khả năng ): bước và người xây có thể được thử nghiệm trong sự cô lập.
Thành phần lõi của hệ thống lưu động
Một thiết kế sạch đòi hỏi ba yếu tố trừu tượng chính: dòng chảy làm việc, một giao diện Step, và một người thợ xây biết cách lắp ráp bước vào dòng chảy làm việc.
Hướng dẫn lớp người làm việc
Lớp Công nhân lưu giữ một tập hợp các bước đã sắp xếp và cung cấp một phương pháp để thực hiện chúng theo trình tự.
<?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;
}
}
Việc thực hiện tối thiểu này là đủ để chứng minh khái niệm. Trong một ứng dụng Laravel thật, bạn có thể tiêm một hoặc vào dòng chảy, nhưng ngay cả không có chúng, mẫu vẫn còn vững chắc.
Tạo giao diện bước
Mỗi bước tham gia vào dòng làm việc phải thực hiện một giao diện chung. Điều này đảm bảo dòng WorkSluve có thể gọi trên bất kỳ bước nào mà không biết logic nội bộ của nó.
<?php
namespace App\Workflow;
interface Step
{
public function execute(): void;
}
Bạn có thể mở rộng giao diện này theo thời gian. Ví dụ, thêm hoặc cho phép thực hiện điều kiện và giao dịch như cuộn cuộn giấy - cả hai đều hữu ích trong dòng sản xuất.
Những bước tiến nhỏ
Các bước cụ thể thực hiện công việc thực tế. Dưới đây là ví dụ về hai bước phổ biến: gửi một email và xử lý dữ liệu.
<?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);
}
}
Bằng cách giữ những bước nhỏ và tập trung, bạn khuyến khích sự tái sử dụng trên các luồng công việc khác nhau.
Làm người xây dựng phấn khởi
Lớp người xây dựng cung cấp một giao diện trôi chảy để xây dựng một đối tượng làm việc. mỗi phương pháp trên xây dựng thêm một bước cấu hình cho ví dụ nội bộ lưu lượng, sau đó tự trả về để dây xích.
<?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;
}
}
Giao diện Mạng và Chuỗi
Giao diện bằng phẳng là thứ làm cho mô hình xây dựng chiếu sáng trong Laravel. Các nhà phát triển có thể sáng tác một dòng công việc trong một biểu thức:
$workflow = (new WorkflowBuilder())
->addEmailStep('[email protected]', 'Welcome', 'Your account is ready.')
->addDataProcessingStep(['user_id' => 42, 'action' => 'register'])
->build();
$workflow->run();
Khả năng đọc này giảm tải nhận thức và làm cho nó dễ dàng sắp xếp lại bước khi các quy tắc kinh doanh thay đổi. Đối với những kịch bản phức tạp hơn, một [FLT: 0] [FLT:] lớp [FLT:] có thể sắp xếp lại nhiều nhà xây dựng đã được định trước, v., [FLT: 10] trả lại đầy đủ một dòng công việc xây dựng cho người dùng mới đăng ký.
Tính năng chảy công việc cao cấp
Một hệ thống sản xuất cần nhiều hơn là chỉ thực hiện tuyến tính, nhưng chúng ta hãy nâng cao kiến trúc để có thể hỗ trợ các bước điều kiện, sai sót và kiên trì.
Những bước có điều kiện để dùng những lời khuyên
Không phải mọi bước nên chạy mỗi lần. Bằng cách mở rộng giao diện Step với một phương pháp , bạn có thể thực hiện quyết định thực hiện dựa trên dữ liệu thời gian chạy.
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...
}
}
Phương pháp của cuốn Work Flu (Công việc lưu động) sau đó kiểm tra tình trạng mỗi bước trước khi thi hành.
Lỗi khi đọc và cuộn ngược
Khi một bước không thành công, bạn có thể muốn hoàn thành bước (một mẫu saga). Thêm một phương pháp vào giao diện Step:
interface Step
{
public function execute(): void;
public function rollback(): void;
}
Dòng chảy Công việc sau đó trở thành một người quản lý giao dịch:
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;
}
}
Điều này đặc biệt có giá trị cho các hoạt động đa bước phải giữ cho dữ liệu được thống nhất, chẳng hạn như giao dịch tài chính hoặc kiểm kê các điều chỉnh.
Trạng thái làm việc dai dẳng
Những chuỗi công việc được người dùng chấp nhận cần phải bền bỉ giữ tình trạng của họ giữa những yêu cầu.
Tạo một mô hình chứa danh sách các bước (được in) và chỉ mục thực hiện hiện hiện hiện hiện thời. Hãy dùng bảng đã đóng:
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();
});
Khi tổng hợp lại, vật thể lưu trữ được xây dựng lại từ các bước được lưu trữ (hoặc định nghĩa bước có thể được tái tạo bằng cách sử dụng máy xây dựng). Một bước có thể là một lớp công việc Laravel, tạo ra các tiến trình thực hiện aynronous bản địa.
Kết hợp với hệ sinh thái của Laravel
Dùng công việc để làm những bước tiến dài
Để có những bước nên chạy trong nền (v. d. gửi báo cáo lớn), hãy chuyển từng bước thành công việc 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;
}
Phát sóng sự tiến bộ
Các bản cập nhật UI thời gian thực có thể làm tăng cường việc phát sóng của Laravel.
public function execute(): void
{
StepStarted::dispatch($this);
// perform work
StepCompleted::dispatch($this);
}
Sau đó, những người nghe có thể phát qua các ổ cắm Web (dùng Laravel Echo) để chuyển đổi bảng điều khiển.
Các vụ án thế giới thật
- Người dùng trên bảng làm việc [FLT: 1]]: tạo tài khoản đích danh gửi email mặc định BAR quyền kích hoạt việc phân tích trên máy bay.
- Dịch vụ Quản lý Hoạt động [FLT: 1]: kiểm tra kho tính tiền tiền trả % % 1 Xác nhận cập nhật hàng đợi hàng đợi cập nhật tập tin.
- Dịch vụ đáp ứng thỏa thuận [FLT: 1]: nộp bản thông báo cho người duyệt thông báo thỏa thuận/rêct xuất bản hoặc gửi trả lại để xem bản sửa đổi.
Trong mỗi trường hợp, người xây dựng cho phép các bộ phận khác nhau định hình thành phần lưu thông làm việc của họ mà không chạm vào cơ chế thực thi tiềm ẩn.
Comment
Một trong những chiến thắng lớn nhất của mô hình là thử nghiệm, mỗi bước có thể được thử nghiệm độc lập.
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]);
}
Kết luận
Mô hình Xây dựng là một điều tự nhiên thích hợp để xây dựng các công việc tự động chạy tự động trong Laravel. Nó khuyến khích khả năng đọc, cấu hình và kiểm tra mã, trong khi giao diện thành thạo phản ánh sự tao nhã mà các nhà phát triển Laravel đã yêu thích. Bằng cách mở rộng các mẫu với điều kiện thực hiện, cuộn tròn, và kiên trì, bạn có thể xây dựng một hệ thống từ hành động tuyến tính đơn giản đến dàn hợp lý, chính thức.
Để hiểu sâu hơn, hãy xem tài liệu chính thức của Laravel [FLT: 0] để tìm hiểu [FLT:] và về việc thực hiện [FLT:], và xem xét lại mẫu [FLT:] [FLT:] để biết thêm về việc xây dựng thiết kế.