2016-10-18 5 views
0

Ich verwende Schlanke Framework Version 3.Zugriff Schlanke Rahmen in Ihren eigenen Klassen

Ich habe die tutorial folgte eine App zum Erstellen. Dazu gehört auch das Einrichten eines classes -Verzeichnisses, in das Sie Ihre eigenen PHP-Klassen einfügen können.

Was ich nicht verstehen kann ist, wie Sie Slim in denen zugreifen können. Zum Beispiel, wenn ich eine Klasse src/classes/Users.php habe und den Slim Response Code z.

return $response->withStatus(302)->withHeader('Location', 'login'); 

Offensichtlich $response, ist zu diesem Zeitpunkt nicht zugegriffen werden. Es scheint nur in index.php zu sein, wo jeder Rückruf es als ein Argument erhält.

Muss ich etwas für jeden Konstruktor meiner eigenen Klassen oder use oder require Aussagen in meinen Klassen passieren müssen?

+0

Sie sollten, was Sie brauchen, in Ihre Klassen, lesen Sie mehr auf Abhängigkeitsinjektion: http://www.phptherightway.com/#dependency_injection – JimL

+0

@JimL Danke für den Link, aber ich brauche bestimmte Hinweise auf dies tun, nicht nur die Theorie. Im Grunde genommen versuche ich nur das Response-Objekt (oder wie immer man es nennt) in meiner Users.php-Klasse zu verwenden. Ich weiß nicht, was ich in meine Klasse bringen soll oder wo. –

Antwort

1

Ich würde sagen, wenn Domain-Layer-Komponenten auf Anwendungsebene Komponenten zugreifen müssen - das ist ein Code-Geruch. Also, überlege, Dinge sonst zu tun, beschreibt Request-Objekt Anfrage. Die Anfrage enthält einige Daten und diese Daten sollten an Ihre Klasse User übergeben werden, nicht an das Objekt selbst.

Wenn Sie noch Request Objekt in Users Klasse verwenden möchten, übergeben Sie es einfach als Argument, wie folgt aus:

// in your routes 
$app->post('users', function($request, $response) { 
    $user = new User; 
    $user->hydrateAndPersist($request); // there you pass it as argument 
}); 

// in your user class 
class User 
{ 
    public function hydrateAndPersist(
     \Psr\Http\Message\ServerRequestInterface $request, 
     \Psr\Http\Message\ResponseInterface $response // yes, you force yourself into injecting response object 
    ) { 
     // request is here, let's extract data from it 
     $submittedData = $request->getParams(); 
     // terrible indeed, but this is just an example: 
     foreach ($submittedData as $prop => $value) { 
      $this->prop = $value; 
     } 
     $result = $this->save(); 
     return $response->withJson($result); 
    } 
} 

jedoch in diesem Fall Ihre User Klasse gekoppelt ist stark mit PSR-7 Anfrage und Antwort Objekte. Manchmal ist die Kopplung kein Problem, aber in Ihrem Fall gehört die Klasse User zur Domänenschicht (da sie die Benutzereinheit beschreibt), während $request und $response Komponenten der Anwendungsschicht sind.

Versuchen Kopplung zu reduzieren:

$app->post('users', function($request, $response) { 

    $submittedData = $request->getParams(); 

    $user = new User; 
    $result = $user->hydrateAndPersist($submittedData); 
    // response is already declared in this scope, let's "put" result of the operation into it 
    $response = $response->withJson($result); 
    return $response; 
}); 

class User 
{ 
    public function hydrateAndPersist(array $data) : bool 
    { 
     $result = false; 
     foreach ($submittedData as $prop => $value) { 
      $this->prop = $value; 
     } 
     $result = $this->save(); 
     return $result; 
    } 
} 

den Nutzen sehen? User::hydrateAndPersist akzeptiert jetzt Array als Argument, es hat keine Kenntnis von $request und $response. Also, es ist nicht an HTTP gebunden (PSR-7 beschreibt HTTP-Nachrichten), es kann mit allem arbeiten. Klassen getrennt, Schichten getrennt, Wartungsfreundlichkeit.

Fazit: Sie $request Objekt in Ihrer User Klasse, indem Sie einfach vorbei $request einem der User Methoden zugreifen können. Dies ist jedoch ein schlechtes Design, das die Wartbarkeit Ihres Codes verringert.

Verwandte Themen