回答編集履歴
1
文章表現を修正
answer
CHANGED
@@ -58,7 +58,7 @@
|
|
58
58
|
---
|
59
59
|
|
60
60
|
Slimの[Slim/Handlers/NotFound.php](https://github.com/slimphp/Slim/blob/3.x/Slim/Handlers/NotFound.php#L54-L59)では、レスポンスの書き換えをおこなうコードを以下のように実装しています。
|
61
|
-
変数`$output`に、
|
61
|
+
変数`$output`に、レスポンスのbodyを上書きする文字列が格納されています。
|
62
62
|
|
63
63
|
```php
|
64
64
|
$body = new Body(fopen('php://temp', 'r+'));
|
@@ -68,9 +68,9 @@
|
|
68
68
|
->withBody($body);
|
69
69
|
```
|
70
70
|
|
71
|
-
このコードを簡単に説明すると、`fopen('php://temp', 'r+')`でストリームを生成して`Body`クラスの引数に渡した後、
|
71
|
+
このコードを簡単に説明すると、`fopen('php://temp', 'r+')`でストリームを生成して`Slim\Http\Body`クラスの引数に渡した後、
|
72
72
|
`write`メソッドで変数`$output`の内容をbodyとして書き込んでいます。
|
73
|
-
レスポンスの書き換えはこれをパクりました。
|
73
|
+
レスポンスのbodyの書き換えはこれをパクりました。
|
74
74
|
|
75
75
|
```php
|
76
76
|
$body = new Body(fopen('php://temp', 'r+'));
|
@@ -92,15 +92,16 @@
|
|
92
92
|
$request = $request->withBody($body);
|
93
93
|
```
|
94
94
|
|
95
|
-
(ストリームとして使うなら、`r+`も`w+`も変わらないと思いますが
|
95
|
+
(ストリームとして使うなら、`r+`も`w+`も変わらないと思いますが、ストリーム関係の動作にはあまり詳しくないので、確証を持って「`r+`も`w+`も同じだ」と言い切ることが出来ません…)
|
96
96
|
|
97
97
|
---
|
98
98
|
|
99
99
|
なお、肝心なことですが、Slimが採用している[PSR-7](http://www.php-fig.org/psr/psr-7/)の`ServerRequestInterface`や`ResponseInterface`は不変オブジェクトです。
|
100
|
-
`StreamInterface`を除き、メソッドを実行しただけではオブジェクトそのものの
|
100
|
+
`StreamInterface`(`getBody`メソッドで取得できるオブジェクト)を除き、メソッドを実行しただけではオブジェクトそのものの状態(オブジェクトの値)が変化せず、そのメソッドの返り値である「状態が変化したオブジェクト」を利用しなくてはなりません。
|
101
101
|
|
102
102
|
このため、`withBody`などのメソッドが返す値のオブジェクトを次に渡す必要があります。
|
103
|
+
このコードでは以下のように変数に再代入して次に渡しています。
|
103
|
-
|
104
|
+
誤って再代入を忘れると、**bodyが上書きされません**。
|
104
105
|
|
105
106
|
```php
|
106
107
|
// 正しい記述
|