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.
Sie sollten, was Sie brauchen, in Ihre Klassen, lesen Sie mehr auf Abhängigkeitsinjektion: http://www.phptherightway.com/#dependency_injection – JimL
@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. –