©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
Laravel Pipelines ist eine weniger bekannte, aber leistungsstarke Funktion von Laravel, die in der offiziellen Laravel-Dokumentation nicht beschrieben ist. Dennoch wird dieses Tool innerhalb des Frameworks weit verbreitet für die Durchführung sequenzieller Operationen verwendet. In diesem Artikel werden wir untersuchen, wie Laravel Pipelines in der CRM-Entwicklung von Vorteil sein kann und Beispiele für deren Verwendung geben, wobei die Prinzipien der sauberen Architektur und der Domain-Driven Design (DDD) eingehalten werden.
Stellen Sie sich ein Szenario vor, in dem Sie einige Anfangsdaten haben, die eine Reihe von sequenziellen Aktionen durchlaufen müssen. Zum Beispiel das Hinzufügen eines neuen Kontakts zu einem CRM-System.
Wenn ein Benutzer einen neuen Kontakt hinzufügt, werden die Daten an den Controller gesendet. Der Kontakt durchläuft mehrere Schritte, bevor er in der Datenbank gespeichert wird:
Wenn ein Benutzer eine Supportanfrage erstellt, durchlaufen die Anfragedaten ebenfalls mehrere Schritte:
Sehen wir uns an, wie sich der Code weiterentwickelt, wenn neue Schritte hinzugefügt werden, wobei die Prinzipien der sauberen Architektur und DDD eingehalten werden.
Zunächst haben wir einen Controller und einen Service, der die Kernlogik bearbeitet. Zum Beispiel das Hinzufügen eines einfachen Kontakts:
// Controller
public function store(Request $request, ContactService $contactService)
{
$contact = $contactService->create($request->all());
return response()->json($contact, 201);
}
// Service
class ContactService
{
protected $contactRepository;
public function __construct(ContactRepository $contactRepository)
{
$this->contactRepository = $contactRepository;
}
public function create(array $data)
{
return $this->contactRepository->create($data);
}
}
// Repository
class ContactRepository
{
public function create(array $data)
{
return Contact::create($data);
}
}
Mit dem Hinzufügen neuer Schritte wird der Code komplexer. Wir verschieben die Logik in separate Klassen:
// Controller
public function store(Request $request, ContactService $contactService)
{
$contact = $contactService->create($request->all());
return response()->json($contact, 201);
}
// Service
class ContactService
{
protected $contactRepository;
public function __construct(ContactRepository $contactRepository)
{
$this->contactRepository = $contactRepository;
}
public function create(array $data)
{
$data = (new TrimWhitespace())->handle($data);
$data = (new ValidateUniqueEmail())->handle($data);
$data = (new GenerateUniqueId())->handle($data);
return $this->contactRepository->create($data);
}
}
Wir können die Schnittstellen vereinheitlichen und Laravel Pipelines für die sequenzielle Ausführung von Schritten verwenden:
// Controller
public function store(Request $request, ContactService $contactService)
{
$contact = $contactService->create($request->all());
return response()->json($contact, 201);
}
// Service
class ContactService
{
protected $contactRepository;
public function __construct(ContactRepository $contactRepository)
{
$this->contactRepository = $contactRepository;
}
public function create(array $data)
{
$pipes = [
TrimWhitespace::class,
ValidateUniqueEmail::class,
GenerateUniqueId::class,
];
$data = app(Pipeline::class)
->send($data)
->through($pipes)
->then(function ($data) {
return $this->contactRepository->create($data);
});
return $data;
}
}
Jeder Schritt (Pipe) sollte die Pipe
-Schnittstelle implementieren:
namespace App\Pipes;
use Closure;
interface Pipe
{
public function handle($data, Closure $next);
}
namespace App\Pipes;
use Closure;
class TrimWhitespace implements Pipe
{
public function handle($data, Closure $next)
{
$data['name'] = trim($data['name']);
return $next($data);
}
}
Manchmal müssen Sie die Ausführung an einem bestimmten Schritt unterbrechen oder die Datenbank von zuvor ausgeführten Schritten bereinigen. Hier ist ein Beispiel, wie solche Probleme behandelt werden können:
class ContactService
{
protected $contactRepository;
public function __construct(ContactRepository $contactRepository)
{
$this->contactRepository = $contactRepository;
}
public function create(array $data)
{
$pipes = [
TrimWhitespace::class,
ValidateUniqueEmail::class,
GenerateUniqueId::class,
];
try {
DB::beginTransaction();
$data = app(Pipeline::class)
->send($data)
->through($pipes)
->then(function ($data) {
return $this->contactRepository->create($data);
});
DB::commit();
return $data;
} catch (Exception $e) {
DB::rollback();
throw $e;
}
}
}
Hier wird eine Transaktion verwendet, um die Datenintegrität sicherzustellen. Im Falle eines Fehlers wird die Transaktion zurückgesetzt (DB::rollback()), und eine Fehlermeldung wird zurückgegeben.
Laravel Pipelines ist ein leistungsstarkes Tool zur Verwaltung sequenzieller Operationen. Es hilft, Spaghetti-Code zu vermeiden und den Code sauberer und wartbarer zu machen. In diesem Artikel haben wir Beispiele für die Verwendung von Laravel Pipelines zur Verwaltung von Kontakten und Supportanfragen in einem CRM-System untersucht, wobei die Prinzipien der sauberen Architektur und DDD eingehalten wurden. Wir hoffen, dass diese Informationen für Ihre Projektentwicklung nützlich sind.
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten