teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

updated

2016/03/25 14:55

投稿

mpyw
mpyw

スコア5223

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

2016/03/25 14:55

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  - [SlimFramework 3](http://www.slimframework.com/)
6
6
 
7
- 「1ファイルに1処理」問題を解決するためにあるのが**ルーティング**および**HTMLテンプレート**です.これはMVCフレームワークでもマイクロフレームワークでも使われます.ルーティングはURLを見てどういう処理を実行するのかを制御するものです.HTMLテンプレートは,HTMLの中にPHPのコードが入り乱れて読みにくくならないようにするためには必須の分離手法です.「*.php」の拡張子を消すことが出来たり,必ずしもパラメータを「?a=b&c=d」の形式で渡す必要がないのもメリットです.例えばこんな感じ.
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
- さてWebブラウザに表示されるビューの部分,上記のコールバックからHTMLテンプレートに変数当てはめて表示する,という方法が用いられます.PHPは`<?php ?>`いう構文か分かる通り言語自体がテンプートエジンの機能持っていまが,若干機能不足ったりするので,それを補うためTwigテンプレートエンンが用いれることが多いです.
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