2014-06-29 4 views
9

Wie werden Benutzersitzungen in domänengesteuertem Design (in einem MVC-Framework) behandelt?So behandeln Sie Benutzersitzungen in domänengesteuertem Design

Ich habe ein User Domain-Objekt, ein UserRepository und ein UserService.

Ich habe diese Methode in meiner UserService Klasse bekam, der sich anmeldet Benutzer.

public function login($email, $password, $remember = false) 
{ 
    $user = $this->userRepo->findByEmail($email); 

    if ($user && $user->getPassword() === $password) { 
     return $user; 
    } 

    return false; 
} 

Wie halte ich sie mit Sitzungen angemeldet?

Wie würde ich den Benutzer basierend auf einer Sitzungsbenutzer-ID automatisch laden?

Kann jemand mir ein Beispiel mit Code geben, wie ich den Benutzer in meiner Anwendung in DDD unterstützen konnte?

Antwort

1
if(!isset($_SESSION['user'])) { 
    if ($user && $user->getPassword() === $password) { 
     $_SESSION['user'] = $user; 
     return $user; 
    } 
} else { 
    return $_SESSION['user']; 
} 

vielleicht so etwas. stellen Sie einfach sicher, dass auf der Abmelden-Funktion Sie die Sitzungen zerstören

8

Von einer DDD-Perspektive ist die Verwaltung von Sitzungen eine eindeutige Reihe von Verhaltensweisen, daher verdient einen dedizierten Dienst. Also erstelle einen solchen Dienst.

Sie können diesen Dienst an Ihre UserService als Abhängigkeit übergeben, sodass die UserService den Sitzungsmanager zum Speichern von Authentifizierungsinformationen verwenden kann.

Besser noch, das Konzept der Authentifizierung kann auch als eine bestimmte Reihe von Verhaltensweisen gesehen werden, also erstellen Sie einen Service dafür. Übergeben Sie Ihren UserService und den Sitzungsmanager als Abhängigkeiten an diesen Authentifizierungsdienst. (So ​​ist der Session Manager nicht mehr eine Abhängigkeit von UserService.)

Aber auch Authentifizierung kann in mehrere verschiedene Teile aufgeteilt werden, es hängt davon ab, wie weit Sie gehen möchten.

Ich kann Ihnen leider keinen Code zeigen, weil das stark davon abhängen würde, welche Art von Authentifizierung Sie durchführen möchten (HTTP Basic, Formularanmeldung, OAuth, etc), welche Abstraktionsstufe Sie erreichen wollen und Ihre persönlichen Vorlieben. Wenn Sie sehen möchten, wie ein komplexes System aussehen kann, sehen Sie sich die Sicherheitskomponente von Symfony 2, here in the documentation und here on github an.

Und wenn Sie diese Komponente verwenden möchten, können Sie sehen, wie Silex implements it (github) um ein Gefühl dafür zu bekommen, wie Sie es verwenden können.

Exkurs

DDD geht es um viel mehr als Ihren Code in einer bestimmten Art und Weise zu schreiben. Wenn Sie DDD lernen möchten, empfehle ich Ihnen, das Domain-Driven Design: Tackling Complexity in the Heart of Software (das blaue Buch), Implementing Domain-Driven Design (das rote Buch) zu lesen, oder Sie können mit Domain Driven Design Quickly starten, die zum Download verfügbar ist.

+1

Ich empfehle auch dringend Symfony Security-Komponente (oder Spring Security von SpringFramework (Java) auf denen es basiert) wie es komplexe Konzept der Authentifizierung und Autorisierung in kleine Stücke mit klaren Beziehungen bricht. +1 auf. – Crozin