2016-06-20 6 views
0

Zend\Http\Client(または他のモジュール)をPSR-7ミドルウェアとして追加するにはどうすればよいですか?Zend Http ClientとしてZend Expressiveのためのミドルウェア

まず私が思っ​​た:

ケースアクション

  • 追加工場
  • $client->request('GET');

しかし、イムわからないようなアクションでZend\Http\Clientインスタンス

  • 使用Zend\Http\Clientインスタンスを注入しますこれが正しければ。 MiddlewareInterfaceを実装し、__invokeメソッドを提供する必要がありますか?

    EDIT:@xtreamwayzのおかげと@timdev https://stackoverflow.com/a/37928824/3411766 https://stackoverflow.com/a/37934597/3411766

    それがあるように、イムは、クライアントを使用しています。 @timdexはfactoryを介してcontainer-> getで取得するように言いました。 ありがとう=)

  • 答えて

    1

    Zend \ Http \ Clientは必要ありません。ミドルウェアを呼び出すときに、すべてのデータを含む要求が注入されます。 Zendの-表情豊かなアクションミドルウェアは、次のようになります。

    <?php 
    
    namespace App\Action; 
    
    use Psr\Http\Message\ResponseInterface as Response; 
    use Psr\Http\Message\ServerRequestInterface as Request; 
    use Zend\Diactoros\Response\HtmlResponse; 
    use Zend\Expressive\Template\TemplateRendererInterface; 
    
    class ViewUserAction implements MiddlewareInterface 
    { 
        private $template; 
    
        private $userRepository; 
    
        public function __construct(
         TemplateRendererInterface $template, 
         UserRepository $userRepository 
        ) { 
         $this->template  = $template; 
         $this->userRepository = $userRepository; 
        } 
    
        public function __invoke(Request $request, Response $response, callable $out = null) 
        { 
         $id = (int) $request->getAttribute('id'); 
         $user = $this->userRepository->find($id); 
         if (!$user) { 
          return $out($request, $response->withStatus(404), 'Not found'); 
         } 
    
         return new HtmlResponse($this->template->render('template', [ 
          'user' => $user, 
         ])); 
        } 
    } 
    

    表現を使用すると、要求データを取得するために必要なすべてのメソッドが含まれているzend-stratigility requestオブジェクトを注入します。

    MiddlewareInterfaceの実装はオプションですが、通常これを行います。そして、Expressiveがミドルウェアを呼び出す方法であるので、それは__invokeメソッドを必要とします。

    ミドルウェアのみを使用してリクエストとレスポンスを操作します。何か他のものについては、いつものようにどんなフレームワークのコンポーネントも使えます。

    1

    あなたの質問を正しく読んでいるのであれば、表現力豊かなアプリでZend \ Http \ Clientをいくつかのアクションで使いたいだけですか?

    これが当てはまる場合、ミドルウェアの概念が混乱しています。 HTTPクライアントは、ミドルウェアとして使用しません。ミドルウェアではなく、ミドルウェアとして動作しないためです。それは単なるクライアントオブジェクトです。あなたには、いくつかのアクションでHTTPクライアントを使用したい場合は次のいずれかを実行します

    1. だけで、必要なときにそれを設定/インスタンス、または
    2. は、あなたが使用しているDICどんな容器にサービスとしてそれを定義します。

    同様に設定されたインスタンスをさまざまなアクションで使用する予定で、いくつかの初期設定をDRYしたい場合は、コンテナからプルすることをお勧めします。

    関連する問題