Στο οικοσύστημα Laravel, μια αποδεδειγμένη προσέγγιση που ισορροπεί κομψά την ευελιξία και τη διατηρησιμότητα είναι το μοτίβο Builder. Αυτό το άρθρο παρέχει έναν βαθύ, πρακτικό οδηγό για το σχεδιασμό ενός συστήματος αυτοματοποίησης ροής εργασίας χρησιμοποιώντας το μοτίβο Builder στο Laravel, που κινείται από τις βασικές αρχές σε προηγμένες, παραγωγικές ⁇ έτοιμες υλοποιήσεις.

Κατανόηση του μοτίβου οικοδόμος σε ένα πλαίσιο Laravel

Το μοτίβο Builder είναι ένα μοτίβο δημιουργικού σχεδιασμού που διαχωρίζει την κατασκευή ενός σύνθετου αντικειμένου από την τελική του αναπαράσταση. Αντί να αναγκάζει έναν ενιαίο κατασκευαστή με πολλές παραμέτρους, το μοτίβο Builder σας επιτρέπει να κατασκευάσετε ένα βήμα αντικείμενο ⁇ προς ⁇ βήμα, κάνοντας τη διαδικασία δημιουργίας τόσο αναγνώσιμη όσο και ευέλικτη.

Στο πλαίσιο της αυτοματοποίησης ροής εργασίας, το «σύμπλεγμα αντικείμενο» είναι μια σειρά από βήματα (μια ροή εργασίας). Χρησιμοποιώντας ένα Builder, μπορείτε να ορίσετε ροές εργασίας ποικίλης σύνθεσης ⁇ προσθήκη, αφαίρεση, ή αναδιατάξει βήματα ⁇ χωρίς να αλλοιώσετε τις υποκείμενες τάξεις βημάτων. Αυτή η αποσύνδεση κάνει το σύστημα εύκολο να επεκταθεί και να δοκιμαστεί.

Βασικά πλεονεκτήματα περιλαμβάνουν:

  • ⁇ ιαβάσιμο: Οι μέθοδοι αλυσιδώματος μοιάζουν με DSL για ορισμούς ροής εργασίας.
  • Μεταλλαξιογόνος: Το αντικείμενο της ροής εργασίας μπορεί να εκτελεστεί ή να διατηρηθεί χωρίς παρενέργειες.
  • ⁇ ιοκιμότητα: Βήματα και ο κατασκευαστής μπορούν να δοκιμαστούν μεμονωμένα.

Βασικά συστατικά του συστήματος ροής εργασίας

Ένας καθαρός σχεδιασμός απαιτεί τρεις πρωταρχικές αφαιρέσεις: την ίδια τη ροή εργασίας, μια διεπαφή Βήμα, και έναν κατασκευαστή που ξέρει πώς να συγκεντρώσει βήματα σε μια ροή εργασίας.

Καθορισμός της τάξης ροής εργασίας

Η τάξη της ροής εργασίας κατέχει μια οργανωμένη συλλογή από βήματα και παρέχει μια μέθοδο για την εκτέλεσή τους σε ακολουθία. Δεν πρέπει να ενδιαφέρεται για τις λεπτομέρειες κάθε βήματος ⁇ μόνο ότι εφαρμόζουν μια καθορισμένη σύμβαση.

<?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, μπορείτε να κάνετε την ένεση [[LFT:1]] ή [[LUT:2]] στη ροή εργασίας, αλλά ακόμα και χωρίς αυτά, το μοτίβο παραμένει στερεό.

Δημιουργία της διεπαφής βήματος

Κάθε βήμα που συμμετέχει σε μια ροή εργασίας πρέπει να υλοποιεί μια κοινή διεπαφή. Αυτό εξασφαλίζει ότι η ροή εργασίας μπορεί να καλέσει [[LFT:3]] σε οποιοδήποτε βήμα χωρίς να γνωρίζει την εσωτερική λογική της.

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

Διασύνδεση και αλυσίδα με τον αέρα

Η άπταιστη διεπαφή είναι αυτό που κάνει το μοτίβο Builder λάμψη στο Laravel. Οι προγραμματιστές μπορούν να συνθέσουν μια ροή εργασίας σε μια ενιαία έκφραση:

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

$workflow->run();

Για πιο πολύπλοκα σενάρια, μια Director[[LFT:1]] κλάση μπορεί να περιλάβει αρκετούς προκαθορισμένους κατασκευαστές, π.χ. [[LFT:10]] που επιστρέφει μια πλήρως ενσωματωμένη ροή εργασίας για νέα εγγραφή χρήστη.

Προηγμένα χαρακτηριστικά ροής εργασίας

Ας ενισχύσουμε την αρχιτεκτονική για να υποστηρίξουμε τα υπό όρους βήματα, τον χειρισμό σφαλμάτων και την επιμονή.

Βήματα υπό όρους χρησιμοποιώντας Προβλεψίες

Με την επέκταση της διεπαφής Βήμα με μια μέθοδο, μπορείτε να πάρετε αποφάσεις εκτέλεσης με βάση τα δεδομένα χρόνου εκτέλεσης.

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

Η μέθοδος της ροής εργασίας θα έλεγχε στη συνέχεια την κατάσταση κάθε βήματος πριν την εκτέλεσή της.

Σφάλμα χειρισμού και επαναφοράς

Όταν ένα βήμα αποτύχει, ίσως θελήσετε να αναιρέσετε τα προηγουμένως ολοκληρωμένα βήματα (ένα μοτίβο έπους). Προσθέστε μια μέθοδο [[LPT: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;
 }
}

Η μέθοδος αυτή είναι ιδιαίτερα πολύτιμη για πράξεις πολλαπλών σταδίων που πρέπει να διατηρούν τη συνοχή των δεδομένων, όπως οι χρηματοοικονομικές συναλλαγές ή οι προσαρμογές αποθεμάτων.

Διαμένουσα κατάσταση ροής εργασίας

Μακροχρόνιες ροές εργασίας (π.χ. αλυσίδες έγκρισης χρηστών) πρέπει να επιμένουν στην κατάστασή τους μεταξύ των αιτημάτων.

Δημιουργία ενός μοντέλου που αποθηκεύει τη λίστα των βημάτων (σειριακού τύπου) και του τρέχοντος δείκτη εκτέλεσης. Χρησιμοποιήστε έναν ειδικό πίνακα:

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. Η ροή εργασίας μπορεί να στείλει εργασίες σε ακολουθία, ή ο κατασκευαστής μπορεί να τυλίξει ένα βήμα μέσα σε μια τάξη εργασίας.

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

Πρόοδος ροής εργασίας για ραδιοτηλεοπτικούς φορείς

Κάθε βήμα μπορεί να πυροδοτήσει ένα γεγονός πριν και μετά την εκτέλεση:

public function execute(): void
{
 StepStarted::dispatch($this);
 // perform work
 StepCompleted::dispatch($this);
}

Οι ακροατές μπορούν στη συνέχεια να μεταδίδουν μέσω WebSockets (χρησιμοποιώντας το Laravel Echo) σε ένα ταμπλό του frontend.

Πραγματικές υποθέσεις χρήσης World

  • Χρήστης εποχούμενης ροής εργασίας: Δημιουργία λογαριασμού → αποστολή καλωσορίσματος email → εκχωρήστε προεπιλεγμένες άδειες → ενεργοποίησης της ανάλυσης.
  • Διαταγή Επεξεργασία Ροή εργασίας: Επικύρωση απογραφής → χρέωση πληρωμής → αποστολή επιβεβαίωση παραγγελίας → ενημέρωση ουρά αποστολής.
  • Ροή εργασίας για την περιορισμένη έγκριση: Υποβολή σχεδίου → κοινοποίηση κριτής → έγκριση/απόρριψη → δημοσίευση ή αποστολή πίσω για αναθεώρηση.

Σε κάθε περίπτωση, το μοτίβο Builder επιτρέπει σε διαφορετικά τμήματα να καθορίσουν τη δική τους σύνθεση ροής εργασίας χωρίς να αγγίζουν τον υποκείμενο κινητήρα εκτέλεσης.

Δοκιμή ροών εργασίας

Κάθε βήμα μπορεί να δοκιμαστεί ανεξάρτητα. Ο κατασκευαστής μπορεί να δοκιμαστεί με χλευασμένα βήματα για να επαληθεύσει ότι η σωστή ακολουθία των βημάτων συναρμολογείται. Οι δοκιμές ολοκλήρωσης μπορούν να εκτελέσουν την πλήρη ροή εργασίας χρησιμοποιώντας πλαστές υλοποιήσεις εξωτερικών υπηρεσιών (π.χ., ).

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

Συμπέρασμα

Το μοτίβο Builder είναι μια φυσική εφαρμογή για την κατασκευή ευέλικτη αυτοματοποίηση ροής εργασίας στο Laravel. Προωθεί αναγνώσιμο, διαμορφώσιμο, και δοκιμαστό κώδικα, ενώ η άπταιστη διεπαφή καθρεφτίζει την κομψότητα που οι προγραμματιστές Laravel ήδη αγαπούν. Με την επέκταση του μοτίβου με υπό όρους εκτέλεση, αναδρομές, και επιμονή, μπορείτε να οικοδομήσετε ένα σύστημα που κλιμακώνεται από απλές γραμμικές δράσεις σε σύνθετες, επιβλητικές ενορχήστρες.

Για να εμβαθύνετε την κατανόησή σας, εξερευνήστε την επίσημη τεκμηρίωση του Laravel σχετικά με queues[[LFT:1]]] και [[LFT:2]]events[[LFT:3]] για ασύγχρονη εκτέλεση ροής εργασίας και αναθεωρήστε το [[[LFT:4]]Builder pattern[[LPT:5]]] για την επαναπαραγωγική Guru για επιπλέον σχεδιαστικές εκτιμήσεις.