回答編集履歴
2
updated
test
CHANGED
@@ -14,15 +14,15 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
- 「/entry/list」にGETでアクセスが来たら,投稿一覧を取得
|
17
|
+
- 「/entry/list」にGETでアクセスが来たら,投稿一覧を取得する
|
18
18
|
|
19
|
-
- 「/entry/post」にPOSTでアクセスが来たら,新規投稿を追加
|
19
|
+
- 「/entry/post」にPOSTでアクセスが来たら,新規投稿を追加する
|
20
20
|
|
21
|
-
- 「/user/profile/ユーザ名」にGETでアクセスが来たら,該当ユーザのプロフィールを取得
|
21
|
+
- 「/user/profile/ユーザ名」にGETでアクセスが来たら,該当ユーザのプロフィールを取得する
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
この「〜をする」
|
25
|
+
この「〜を取得する」の処理の部分ですが,**これを1ファイルにまとめる必要はありません**.堂々と分離させましょう.この際,**処理をクラスメソッドや関数として定義しておく**と,全体の見通しがよくなります.**グローバルスコープに処理をズラズラ書き並べるのは可能な限り避けましょう**.
|
26
26
|
|
27
27
|
|
28
28
|
|
@@ -44,9 +44,13 @@
|
|
44
44
|
|
45
45
|
|
46
46
|
|
47
|
-
class UserController
|
47
|
+
class UserController
|
48
48
|
|
49
|
+
{
|
50
|
+
|
49
|
-
public function showProfile($request, $response, $args)
|
51
|
+
public function showProfile($request, $response, $args)
|
52
|
+
|
53
|
+
{
|
50
54
|
|
51
55
|
$params = $request->getQueryParams();
|
52
56
|
|
@@ -89,3 +93,93 @@
|
|
89
93
|
}
|
90
94
|
|
91
95
|
```
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
なお実際にはデータベースに繋いでユーザ情報を取得してくることになると思いますが,全てのメソッドの中にPDOを扱う処理を毎回記述するのは非常に冗長なので,こういう処理は別のクラスにまとめておきましょう.そして,`Slim\App`のインスタンスを作る際に渡すコンテナにあらかじめ突っ込んでおき,後から参照するようにしましょう.例えばこんな感じ.
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
(サービスロケータというアンチパターンを使っているんですが,まぁSlim3がそういう設計思想なのでしょうがないですね)
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
```php
|
108
|
+
|
109
|
+
$container = new Slim\Container;
|
110
|
+
|
111
|
+
$container['db'] = function () { return new DB; };
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
$app = new Slim\App($container);
|
116
|
+
|
117
|
+
$app->get('/user/profile/{name}', 'UserController:showProfile');
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
class UserController
|
122
|
+
|
123
|
+
{
|
124
|
+
|
125
|
+
private $db;
|
126
|
+
|
127
|
+
public function __construct(ContainerInterface $container)
|
128
|
+
|
129
|
+
{
|
130
|
+
|
131
|
+
$this->db = $container['db'];
|
132
|
+
|
133
|
+
}
|
134
|
+
|
135
|
+
public function showProfile($request, $response, $args)
|
136
|
+
|
137
|
+
{
|
138
|
+
|
139
|
+
$params = $request->getQueryParams();
|
140
|
+
|
141
|
+
return $response->withJSON([
|
142
|
+
|
143
|
+
'name' => $args['name'],
|
144
|
+
|
145
|
+
'description' => $this->db->getDescriptionByName($args['name']),
|
146
|
+
|
147
|
+
]);
|
148
|
+
|
149
|
+
}
|
150
|
+
|
151
|
+
}
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
class DB
|
156
|
+
|
157
|
+
{
|
158
|
+
|
159
|
+
private $dbh;
|
160
|
+
|
161
|
+
public function __construct()
|
162
|
+
|
163
|
+
{
|
164
|
+
|
165
|
+
$this->dbh = new PDO(...);
|
166
|
+
|
167
|
+
}
|
168
|
+
|
169
|
+
public function getDescriptionByName($name)
|
170
|
+
|
171
|
+
{
|
172
|
+
|
173
|
+
$stmt= $this->dbh->prepare(...);
|
174
|
+
|
175
|
+
...
|
176
|
+
|
177
|
+
return ...;
|
178
|
+
|
179
|
+
}
|
180
|
+
|
181
|
+
}
|
182
|
+
|
183
|
+
```
|
184
|
+
|
185
|
+
|
1
updated
test
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
-
「1ファイルに1処理」問題を解決するためにあるのが**ルーティング**
|
13
|
+
「1ファイルに1処理」問題を解決するためにあるのが**ルーティング**です.これはMVCフレームワークでもマイクロフレームワークでも使われます.ルーティングはURLを見てどういう処理を実行するのかを制御するものです.「*.php」の拡張子を消すことが出来たり,必ずしもパラメータを「?a=b&c=d」の形式で渡す必要がないのもメリットです.例えばこんな感じ.
|
14
14
|
|
15
15
|
|
16
16
|
|
@@ -34,11 +34,7 @@
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
-
さてWebブラウザに表示されるビューの部分は,上記のコールバックからHTMLテンプレートに変数を当てはめて表示する,という方法が用いられます.PHPは`<?php ?>`という構文から分かる通り言語自体がテンプレートエンジンの機能を持っていますが,若干機能不足だったりするので,それを補うためにTwigなどのテンプレートエンジンが用いられることが多いです.
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
今回はAPIを作りたい,ということでしたよね?おそらくレスポンスをJSONで返すだけだと思うので,ビューに特別な手間をかける必要はないです.以下のように `$response` オブジェクトから `withJSON()` メソッドを生やすだけです.
|
42
38
|
|
43
39
|
|
44
40
|
|