اتوماسیون گردش کار در قلب بهره وری نرم افزار مدرن قرار دارد، اجازه می دهد تیم ها فرآیندهای پیچیده کسب و کار را با وضوح و کنترل هماهنگ کنند.در اکوسیستم Laravel، یک رویکرد اثبات شده که انعطاف پذیری و قابلیت نگهداری تعادل ظریف الگوی سازنده است.این مقاله یک راهنمای عمیق و عملی برای طراحی یک سیستم اتوماسیون گردش کار با استفاده از الگوی سازنده در Laravel، حرکت از اصول اولیه به پیاده سازی پیشرفته، پیاده سازی تولید آماده سازی.

درک الگوی سازنده در یک متن Laravel

الگوی سازنده یک الگوی طراحی خلقی است که ساخت یک شیء پیچیده را از نمایندگی نهایی جدا می کند، به جای اینکه یک سازنده واحد را با پارامترهای زیادی مجبور کند، الگوی سازنده به شما اجازه می دهد یک شیء را به مرحله ای تبدیل کنید و فرآیند ایجاد را هم قابل خواندن و هم انعطاف پذیر کنید.

در زمینه اتوماسیون گردش کار، "هدف پیچیده" یک توالی از مراحل (یک جریان کاری) با استفاده از یک سازنده است، شما می توانید جریان های کاری ترکیب مختلف را تعریف کنید - اضافه کردن، حذف یا دوباره سفارش گام - بدون تغییر کلاس های گام اساسی سازنده، این سیستم را آسان می کند تا گسترش و آزمایش کند. Laravel توسعه دهندگان از قبل از آن لذت می برند، مانند API گردش کار (به عنوان مثال بخش های ساده).

مزایای کلیدی شامل:

  • ] قابلیت خواندن ; روش های زنجیره ای شبیه به DSL برای تعاریف گردش کار.
  • [[۱]:۱۰] قابلیت استفاده [[۱۰] [۱۰]: جسم گردش کار ساخته شده می تواند اجرا شود یا بدون عوارض جانبی ادامه یابد.
  • [در این میان] [مشرکان]: [۱] گام ها و سازنده را می توان در انزوا آزمایش کرد.

اجزای اصلی سیستم گردش کار

یک طراحی تمیز نیاز به سه انتزاع اولیه دارد: خود گردش کار، یک رابط مرحله و یک سازنده که می داند چگونه گام ها را به یک گردش کار جمع آوری کند.

تعریف کلاس 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 واقعی، شما ممکن است یک [FLT 1] یا را به گردش کار تزریق کنید، اما حتی بدون آن، الگوی آن هنوز جامد است.

ایجاد رابط مرحله

هر قدمی که در گردش کار شرکت می کند باید یک رابط مشترک را پیاده سازی کند.این امر تضمین می کند که گردش کار می تواند بدون دانستن منطق داخلی آن، در هر مرحله فراخوانی کند.

<?php

namespace App\Workflow;

interface Step
{
 public function execute(): void;
}

شما ممکن است این رابط را در طول زمان گسترش دهید، به عنوان مثال، اضافه کردن یا باعث می شود که اجرای مشروط و رول بک های تراکنش مانند - هر دو در جریان های کاری تولید مفید باشند.

پیاده سازی گام های بتنی

گام های بتنی کار واقعی را انجام می دهند.در زیر نمونه هایی از دو مرحله مشترک است: ارسال ایمیل و پردازش داده ها.

<?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);
 }
}

با نگه داشتن گام های کوچک و متمرکز، شما تشویق به بازگشت در سراسر جریان های مختلف کار.

پیاده سازی سازنده

کلاس Builder یک رابط روان برای ساخت یک شیء گردش کار فراهم می کند.هر روش در سازنده یک گام پیکربندی شده به نمونه گردش کار داخلی اضافه می کند، سپس خود را برای زنجیره سازی باز می گرداند.

<?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;
 }
}

رابط و زنجیره ای Fluent Interface and Chaining

رابط کاربری روان چیزی است که الگوی سازنده را در Laravel. Developers می سازد که می تواند یک جریان کاری را در یک عبارت واحد ایجاد کند:

$workflow = (new WorkflowBuilder())
 ->addEmailStep('[email protected]', 'Welcome', 'Your account is ready.')
 ->addDataProcessingStep(['user_id' => 42, 'action' => 'register'])
 ->build();

$workflow->run();

این قابلیت خواندن بار شناختی را کاهش می دهد و باعث می شود که گام های زمانی که قوانین کسب و کار تغییر می کند، برای سناریوهای پیچیده تر، یک Director] کلاس می تواند چندین سازندگان پیش تعریف شده را به صورت جداگانه، به عنوان مثال، که یک جریان کار به طور کامل ساخته شده برای ثبت نام کاربری جدید.

ویژگی های Advanced Workflow

یک سیستم گردش کار تولید نیاز به اجرای خطی دارد، اجازه دهید معماری را برای حمایت از گام های مشروط، دستکاری خطا و پایداری افزایش دهیم.

گام های شرطی با استفاده از Predicates

همه مراحل نباید هر بار اجرا شوند، با گسترش رابط مرحله با یک روش ، شما می توانید تصمیم های اعدام را بر اساس داده های زمان اجرا انجام دهید.

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...
 }
}

روش کار جریان (FLT 13) پس از آن هر مرحله را قبل از اجرای آن بررسی می کند.

خطای مدیریت و روبوت

هنگامی که یک گام شکست می خورد، ممکن است بخواهید مراحل تکمیل شده قبلی را (یک الگوی حماسی) اضافه کنید (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;
 }
}

این الگو به ویژه برای عملیات چند مرحله ای که باید سازگاری داده ها را حفظ کند، مانند معاملات مالی یا تنظیمات موجودی ارزشمند است.

فشار بر گردش کار State

جریان های کاری طولانی مدت (به عنوان مثال زنجیره های تایید کاربر) باید بین درخواست ها به حالت خود ادامه دهند. loquent ORM این کار را ساده می کند.

مدل را ایجاد کنید که لیست مراحل (serialized) و شاخص اجرای فعلی را ذخیره می کند.

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();
});

هنگامی که دوباره مصرف می شود، شیء گردش کار از مراحل سریال سازی شده ذخیره شده (یا تعاریف گام که می تواند با استفاده از سازنده دوباره مورد استفاده قرار گیرد) بازسازی می شود. یک گام می تواند یک کلاس کار Laravel باشد که به عنوان بومی اعدام همزمان انجام می شود.

ادغام با سیستم 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) به داشبورد frontend پخش شوند.

استفاده از پرونده های واقعی

  • User Onboarding Workflow [FLT 1]: Create account [برای ایجاد حساب کاربری] ایمیل های خوش آمدید، اختصاص مجوز های پیش فرض (بعنوان مثال) باعث تجزیه و تحلیل در حال جمع آوری است.
  • ] پردازش گردش کار ؛ موجودی معتبر، پرداخت هزینه پرداخت هزینه - ارسال گواهی سفارش
  • جریان کار تایید محتوا ؛ پیش نویس ارسال کنید، بازبینی کننده را تأیید کنید / ارسال کنید یا برای تجدید نظر ارسال کنید.

در هر مورد، الگوی سازنده به بخش های مختلف اجازه می دهد تا ترکیب گردش کار خود را بدون لمس موتور اجرای اساسی تعریف کنند.

تست گردش کار

یکی از بزرگترین پیروزی های الگو، آزمون پذیری است.هر مرحله می تواند به طور مستقل تست شود. سازنده را می توان با مراحل مسخره آزمایش کرد تا تأیید کند که توالی صحیح گام ها جمع آوری شده است.

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 را در مورد و کشف کنید برای اجرای گردش کار ناهمزمان، و بررسی الگوی Builder [F:5] در Refactoring Guru برای ملاحظات اضافی طراحی.