回答編集履歴

2

updated

2016/03/25 14:55

投稿

mpyw
mpyw

スコア5223

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
- この「〜をする」「〜を行う」の処理の部分ですが,**これを1ファイルにまとめる必要はありません**.堂々と分離させましょう.この際,**処理をクラスメソッドや関数として定義しておく**と,全体の見通しがよくなります.**グローバルスコープに処理をズラズラ書き並べるのは可能な限り避けましょう**.
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

2016/03/25 14:55

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- 「1ファイルに1処理」問題を解決するためにあるのが**ルーティング**および**HTMLテンプレート**です.これはMVCフレームワークでもマイクロフレームワークでも使われます.ルーティングはURLを見てどういう処理を実行するのかを制御するものです.HTMLテンプレートは,HTMLの中にPHPのコードが入り乱れて読みにくくならないようにするためには必須の分離手法です.「*.php」の拡張子を消すことが出来たり,必ずしもパラメータを「?a=b&c=d」の形式で渡す必要がないのもメリットです.例えばこんな感じ.
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
- …ですが,今回はAPIを作りたい,ということでしたよね?おそらくレスポンスをJSONで返すだけだと思うので,ビューに特別な手間をかける必要はないです.以下のように `$response` オブジェクトから `withJSON()` メソッドを生やすだけです.
37
+ 今回はAPIを作りたい,ということでしたよね?おそらくレスポンスをJSONで返すだけだと思うので,ビューに特別な手間をかける必要はないです.以下のように `$response` オブジェクトから `withJSON()` メソッドを生やすだけです.
42
38
 
43
39
 
44
40