Application Service-Layer - wie API-Methode Schnittstellen schreiben
-
28-09-2019 - |
Frage
Wie gestalten Menschen ihre Service-Layer-Schnittstellen?
Ich programmiere eine große Web-Anwendung (in PHP) und wir MVC verwenden und Programmierung dünne Controller z.B. (Pseudo-Code folgt)
public savePersonAction() {
$input = filter($_GET);
... input validation ...
$result = $this->_service->savePerson( ? );
... etc
}
Should savePerson in dem Dienst nimmt ein Argument der gesamten $ Input-Struktur oder Kontextes (in PHP, ein assoziatives Array)?
z. dies -
public function savePerson(array $input) {
oder sollte man alle die Eingabefelder trennen und bieten eine „harte“ Schnittstelle z.
public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) {
Danke.
Paul
Lösung
Wenn Sie vorhaben, die MVC-Geist Ihrer savePerson
Methode zu folgen, soll nicht die rohe Eingabe akzeptieren. Es sollte nicht direkt mit dem Format der Daten gekoppelt wird aus dem ui kommen. Stattdessen sollten sie Eingang in den Bedingungen Ihrer Servicedomäne, wie ein „Person“ Objekt definiert akzeptieren. (Dies könnte nur ein assoziatives Array vorgeschlagen wie Cobby sein). Es wäre die Aufgabe des Aktionsmethode des Controllers die rohe Eingabe in das Format, das von dem Dienst erforderlich abzubilden.
Der Vorteil dieses zusätzlichen Übersetzungsschrittes ist, dass es Ihr Service-Isolaten (Modell) von der ui. Wenn Sie eine andere ui implementieren, müssen Sie nicht die Service-Schnittstelle ändern. Sie müssen nur neue Controller schreiben (und Ansichten, natürlich).
Während Ihr Beispiel wie savePerson($title, $firstName, $lastName...)
die richtige Idee ist, es ist in der Regel ein schlechtes Zeichen, wenn Sie haben Methoden mit mehr als 2 oder 3 Argumenten. Sie sollten, um verwandte Argumente in eine Art übergeordnete Objekt der Lage sein.
Andere Tipps
Meine MVC-Anwendungen sind wie folgt strukturiert: Controller -> Service -> ORM / andere Bibliothek
Um Ihre Frage zu beantworten, in der Regel in Ihrem Controller werden Sie Formulardaten als Array bekommen, das heißt $ form-> getValues ??() oder etwas ähnliches. In Bezug auf der Wartbarkeit ist es am besten, wenn Ihre Dienste außer Arrays als Argumente, auf diese Weise, wenn Sie ein anderes Feld zu einem Formular hinzufügen, müssen Sie nur das Formular zu aktualisieren und den Service, den Controller kann unberührt bleiben und immer noch arbeiten.
Also ich denke, mit dem ersten Beispiel gehen:
public function savePerson($personArray);
Darüber hinaus sollten Sie keine „harte“ Schnittstelle benötigen, weil Sie Ihre Formularbibliothek kümmern wird die Validierung / filteration / sanitization so können wir davon ausgehen, dass die assoziative Arrays gültig sein wird, sowie die Methodendefinition wird lächerlich lange erhalten mit dem Namen Parameter.
Ich möchte alle die Eingabefelder trennen und bieten eine „harte“ Schnittstelle in Service z.
public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...}
Sein sauberer und es gibt keine Annahmen erforderlich.