5

私のアプリケーションの応答の大部分は、ビューまたは JSON です。PSR-7ResponseInterfaceで実装するオブジェクトにそれらを配置する方法がわかりません。

これが私が現在行っていることです:

// Views
header('Content-Type: text/html; charset=utf-8');
header('Content-Language: en-CA');
echo $twig->render('foo.html.twig', array(
    'param' => 'value'
    /* ... */
));

// JSON
header('Content-Type: application/json; charset=utf-8');
echo json_encode($foo);

これが私がPSR-7でやろうとしていることです:

// Views
$response = new Http\Response(200, array(
    'Content-Type' => 'text/html; charset=utf-8',
    'Content-Language' => 'en-CA'
));

// what to do here to put the Twig output in the response??

foreach ($response->getHeaders() as $k => $values) {
    foreach ($values as $v) {
        header(sprintf('%s: %s', $k, $v), false);
    }
}
echo (string) $response->getBody();

そして、ヘッダーが異なるだけで、JSON 応答についても同様になると思います。私が理解しているように、メッセージ本文は でありStreamInterface、で作成されたファイルリソースを出力しようとすると機能しますfopenが、文字列でそれを行うにはどうすればよいですか?

アップデート

Http\Response私のコードでは、実際にResponseInterfaceは PSR-7 の私自身の実装です。現在 PHP 5.3 で立ち往生しているため、すべてのインターフェイスを実装しましたが、PHP < 5.4 と互換性のある実装が見つかりませんでした。のコンストラクタは次のHttp\Responseとおりです。

public function __construct($code = 200, array $headers = array()) {
    if (!in_array($code, static::$validCodes, true)) {
        throw new \InvalidArgumentException('Invalid HTTP status code');
    }

    parent::__construct($headers);
    $this->code = $code;
}

出力をコンストラクター引数として受け入れるように実装を変更できます。代わりにwithBody、実装のメソッドを使用することもできますMessageInterface。どのように行うかに関係なく、問題は文字列をストリームに取得する方法です

4

1 に答える 1

2

ResponseInterfaceextends は、見つけたゲッターMessageInterfaceを提供します。getBody()PSR-7 は、オブジェクトの実装ResponseInterfaceが不変であることを期待しています。これは、コンストラクターを変更しないと実現できません。

PHP < 5.4 を実行している (また、タイプヒントを効果的に使用できない) ため、次のように変更します。

public function __construct($code = 200, array $headers = array(), $content='') {
  if (!in_array($code, static::$validCodes, true)) {
    throw new \InvalidArgumentException('Invalid HTTP status code');
  }

  parent::__construct($headers);
  $this->code = $code;
  $this->content = (string) $content;
}

プライベート メンバー$contentを次のように定義します。

private $content = '';

そしてゲッター:

public function getBody() {
  return $this->content;
}

そして、あなたは行ってもいいです!

于 2015-11-22T11:21:03.943 に答える