ドメインレベルのコンポーネントがアプリケーションレベルのコンポーネントにアクセスする必要があるときは、これはコードの匂いです。だから、そうでなければ何かをすることを検討し、要求オブジェクト要求を記述する。リクエストにはいくつかのデータが含まれており、そのデータはリクエストオブジェクトではなく、User
クラスに渡されます。それでもUsers
クラスでRequest
オブジェクトを使用したい場合は
、単にこのように、引数として渡す:
// 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);
}
}
しかし、このケースでは、あなたのUser
クラスは、PSR-7のリクエストとレスポンスを大きく結合されていますオブジェクト。場合によっては結合は問題ではありませんが、User
クラスはドメイン層に属しています(ユーザーエンティティが記述されているため)。$request
と$response
はアプリケーション層のコンポーネントです。
は、結合を低減するようにしてください:
$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;
}
}
利益を参照してください? User::hydrateAndPersist
は配列を引数として受け入れますが、$request
と$response
の知識はありません。だから、それはHTTPに束縛されていません(PSR-7
はHTTPメッセージを記述しています)。クラスが分離され、レイヤーが分離され、メンテナンスが容易です。
合計:User
クラスの$request
オブジェクトにアクセスするには、$request
をUser
のいずれかのメソッドに渡すだけです。しかし、これはあなたのコードの保守性を低下させる貧弱な設計です。
あなたのクラスに必要なものを渡す必要があります。依存性注入の詳細については、http://www.phptherightway.com/#dependency_injectionを参照してください。 – JimL
@JimLリンクをありがとうございますが、これには具体的な指針が必要です。理論。基本的に私がしようとしているのは、自分のUsers.phpクラスでResponseオブジェクト(またはそれを呼び出すもの)を使用することです。私は何をクラスに渡すべきか、どこに渡すべきか分からない。 –