2016-10-18 6 views
0

私はアプリを作成するにtutorialを追ってきたスリムFrameworkバージョン3.独自のクラスでスリムフレームワークへのアクセス

を使用しています。これには、自分のPHPクラスを置くことができるディレクトリclassesを設定する必要があります。

私が理解できないことは、それらの中でスリムにアクセスする方法です。たとえば、私がクラスsrc/classes/Users.phpを持っていて、スリムレスポンスコードを使用したいと思ったとします。

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

明らかに、$responseは、その時点ではアクセスできません。 index.phpにあるようで、各コールバックはそれを引数として受け取ります。

自分のクラスのすべてのコンストラクタに何かを渡す必要がありますか?useまたはrequireの文をクラスに渡す必要がありますか?

+0

あなたのクラスに必要なものを渡す必要があります。依存性注入の詳細については、http://www.phptherightway.com/#dependency_injectionを参照してください。 – JimL

+0

@JimLリンクをありがとうございますが、これには具体的な指針が必要です。理論。基本的に私がしようとしているのは、自分のUsers.phpクラスでResponseオブジェクト(またはそれを呼び出すもの)を使用することです。私は何をクラスに渡すべきか、どこに渡すべきか分からない。 –

答えて

1

ドメインレベルのコンポーネントがアプリケーションレベルのコンポーネントにアクセスする必要があるときは、これはコードの匂いです。だから、そうでなければ何かをすることを検討し、要求オブジェクト要求を記述する。リクエストにはいくつかのデータが含まれており、そのデータはリクエストオブジェクトではなく、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オブジェクトにアクセスするには、$requestUserのいずれかのメソッドに渡すだけです。しかし、これはあなたのコードの保守性を低下させる貧弱な設計です。

関連する問題