回答編集履歴
2
updated
answer
CHANGED
@@ -6,11 +6,11 @@
|
|
6
6
|
|
7
7
|
「1ファイルに1処理」問題を解決するためにあるのが**ルーティング**です.これはMVCフレームワークでもマイクロフレームワークでも使われます.ルーティングはURLを見てどういう処理を実行するのかを制御するものです.「*.php」の拡張子を消すことが出来たり,必ずしもパラメータを「?a=b&c=d」の形式で渡す必要がないのもメリットです.例えばこんな感じ.
|
8
8
|
|
9
|
-
- 「/entry/list」にGETでアクセスが来たら,投稿一覧を取得
|
9
|
+
- 「/entry/list」にGETでアクセスが来たら,投稿一覧を取得する
|
10
|
-
- 「/entry/post」にPOSTでアクセスが来たら,新規投稿を追加
|
10
|
+
- 「/entry/post」にPOSTでアクセスが来たら,新規投稿を追加する
|
11
|
-
- 「/user/profile/ユーザ名」にGETでアクセスが来たら,該当ユーザのプロフィールを取得
|
11
|
+
- 「/user/profile/ユーザ名」にGETでアクセスが来たら,該当ユーザのプロフィールを取得する
|
12
12
|
|
13
|
-
この「〜をする」
|
13
|
+
この「〜を取得する」の処理の部分ですが,**これを1ファイルにまとめる必要はありません**.堂々と分離させましょう.この際,**処理をクラスメソッドや関数として定義しておく**と,全体の見通しがよくなります.**グローバルスコープに処理をズラズラ書き並べるのは可能な限り避けましょう**.
|
14
14
|
|
15
15
|
- [Qiita - Slim 3 Frameworkリリースされたので、ざっと紹介](http://qiita.com/asaokamei/items/f915a625cb4d3f9b38de)
|
16
16
|
|
@@ -21,8 +21,10 @@
|
|
21
21
|
```php
|
22
22
|
$app->get('/user/profile/{name}', 'UserController:showProfile');
|
23
23
|
|
24
|
-
class UserController
|
24
|
+
class UserController
|
25
|
+
{
|
25
|
-
public function showProfile($request, $response, $args)
|
26
|
+
public function showProfile($request, $response, $args)
|
27
|
+
{
|
26
28
|
$params = $request->getQueryParams();
|
27
29
|
return $response->withJSON([
|
28
30
|
'name' => $args['name'],
|
@@ -43,4 +45,48 @@
|
|
43
45
|
"description": "CertaiNのプロフィール",
|
44
46
|
"flag_enabled": true
|
45
47
|
}
|
46
|
-
```
|
48
|
+
```
|
49
|
+
|
50
|
+
なお実際にはデータベースに繋いでユーザ情報を取得してくることになると思いますが,全てのメソッドの中にPDOを扱う処理を毎回記述するのは非常に冗長なので,こういう処理は別のクラスにまとめておきましょう.そして,`Slim\App`のインスタンスを作る際に渡すコンテナにあらかじめ突っ込んでおき,後から参照するようにしましょう.例えばこんな感じ.
|
51
|
+
|
52
|
+
(サービスロケータというアンチパターンを使っているんですが,まぁSlim3がそういう設計思想なのでしょうがないですね)
|
53
|
+
|
54
|
+
```php
|
55
|
+
$container = new Slim\Container;
|
56
|
+
$container['db'] = function () { return new DB; };
|
57
|
+
|
58
|
+
$app = new Slim\App($container);
|
59
|
+
$app->get('/user/profile/{name}', 'UserController:showProfile');
|
60
|
+
|
61
|
+
class UserController
|
62
|
+
{
|
63
|
+
private $db;
|
64
|
+
public function __construct(ContainerInterface $container)
|
65
|
+
{
|
66
|
+
$this->db = $container['db'];
|
67
|
+
}
|
68
|
+
public function showProfile($request, $response, $args)
|
69
|
+
{
|
70
|
+
$params = $request->getQueryParams();
|
71
|
+
return $response->withJSON([
|
72
|
+
'name' => $args['name'],
|
73
|
+
'description' => $this->db->getDescriptionByName($args['name']),
|
74
|
+
]);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
class DB
|
79
|
+
{
|
80
|
+
private $dbh;
|
81
|
+
public function __construct()
|
82
|
+
{
|
83
|
+
$this->dbh = new PDO(...);
|
84
|
+
}
|
85
|
+
public function getDescriptionByName($name)
|
86
|
+
{
|
87
|
+
$stmt= $this->dbh->prepare(...);
|
88
|
+
...
|
89
|
+
return ...;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
```
|
1
updated
answer
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
- [SlimFramework 3](http://www.slimframework.com/)
|
6
6
|
|
7
|
-
「1ファイルに1処理」問題を解決するためにあるのが**ルーティング**
|
7
|
+
「1ファイルに1処理」問題を解決するためにあるのが**ルーティング**です.これはMVCフレームワークでもマイクロフレームワークでも使われます.ルーティングはURLを見てどういう処理を実行するのかを制御するものです.「*.php」の拡張子を消すことが出来たり,必ずしもパラメータを「?a=b&c=d」の形式で渡す必要がないのもメリットです.例えばこんな感じ.
|
8
8
|
|
9
9
|
- 「/entry/list」にGETでアクセスが来たら,投稿一覧を取得
|
10
10
|
- 「/entry/post」にPOSTでアクセスが来たら,新規投稿を追加
|
@@ -16,10 +16,8 @@
|
|
16
16
|
|
17
17
|
上記の「コールバックには何が使えるか?」のところでいろいろなパターンが紹介されています.Slimの公式ドキュメントではクロージャを使ったものがほとんどですが,これを乱立させてしまうとまた1ファイルが膨大になってくるのでおすすめできません.**「クラス名:メソッド名」**が一番いいかと思います.
|
18
18
|
|
19
|
-
|
19
|
+
今回はAPIを作りたい,ということでしたよね?おそらくレスポンスをJSONで返すだけだと思うので,ビューに特別な手間をかける必要はないです.以下のように `$response` オブジェクトから `withJSON()` メソッドを生やすだけです.
|
20
20
|
|
21
|
-
…ですが,今回はAPIを作りたい,ということでしたよね?おそらくレスポンスをJSONで返すだけだと思うので,ビューに特別な手間をかける必要はないです.以下のように `$response` オブジェクトから `withJSON()` メソッドを生やすだけです.
|
22
|
-
|
23
21
|
```php
|
24
22
|
$app->get('/user/profile/{name}', 'UserController:showProfile');
|
25
23
|
|