phpでapiを作る勉強中です。
http://localhost/test/apiTest.php?id=1234
http://localhost/test/apiTest.php?flg=1
というURLで、
apiTest.phpにidを渡して、処理する部分はできました。
idから名前を取得する部分と
仮にflgというパラメータが来るとして、
このflgで別のロジックを処理したい場合は、
ファイルを分ける方法しかございませんか??
今私のレベルでは、ファイル分けて処理するしか思い浮かばずです。
メソッドを分けて呼べる方法とかはありませんか??
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/25 07:14
回答4件
0
ベストアンサー
**「1ファイルに1処理」**というスタイルは,HTML+CSSしか書けなかった素人がWebプログラミングに手をだすための敷居こそ低いものの,機能が増えてくると設計が破綻してきます.「register.php」「postMessage.php」「showMessage.php」「editMessage.php」「showUser.php」「editUser.php」みたいなファイルが大量に並べられることでしょう.
これを防ぐためにPHPを用いた中規模以上の開発ではMVCフレームワークを用いた開発を行うのが一般的です.いきなりこれが敷居が高く感じられるのであれば,V以外を極限まで小さく抑えるマイクロフレームワークを使っても構いません.(後々MVCのほうが良かった,と思うことは多いですが,入門用としてマイクロフレームワークは悪い選択肢ではありません)
「1ファイルに1処理」問題を解決するためにあるのがルーティングです.これはMVCフレームワークでもマイクロフレームワークでも使われます.ルーティングはURLを見てどういう処理を実行するのかを制御するものです.「*.php」の拡張子を消すことが出来たり,必ずしもパラメータを「?a=b&c=d」の形式で渡す必要がないのもメリットです.例えばこんな感じ.
- 「/entry/list」にGETでアクセスが来たら,投稿一覧を取得する
- 「/entry/post」にPOSTでアクセスが来たら,新規投稿を追加する
- 「/user/profile/ユーザ名」にGETでアクセスが来たら,該当ユーザのプロフィールを取得する
この「〜を取得する」の処理の部分ですが,これを1ファイルにまとめる必要はありません.堂々と分離させましょう.この際,処理をクラスメソッドや関数として定義しておくと,全体の見通しがよくなります.グローバルスコープに処理をズラズラ書き並べるのは可能な限り避けましょう.
上記の「コールバックには何が使えるか?」のところでいろいろなパターンが紹介されています.Slimの公式ドキュメントではクロージャを使ったものがほとんどですが,これを乱立させてしまうとまた1ファイルが膨大になってくるのでおすすめできません.**「クラス名:メソッド名」**が一番いいかと思います.
今回はAPIを作りたい,ということでしたよね?おそらくレスポンスをJSONで返すだけだと思うので,ビューに特別な手間をかける必要はないです.以下のように $response
オブジェクトから withJSON()
メソッドを生やすだけです.
php
1$app->get('/user/profile/{name}', 'UserController:showProfile'); 2 3class UserController 4{ 5 public function showProfile($request, $response, $args) 6 { 7 $params = $request->getQueryParams(); 8 return $response->withJSON([ 9 'name' => $args['name'], 10 'description' => "{$args['name']}のプロフィール", 11 'flag_enabled' => !empty($params['flag']), 12 ]); 13 } 14}
注意: Slim3のwithJsonはステータスコードをデフォルトで200に書き換える
上記のルーティングを行っている場合, http://example.com/user/profile/CertaiN?flag=1
でアクセスすると以下のようなJSONが返ってくるはずです. (見やすくしています)
json
1{ 2 "name": "CertaiN", 3 "description": "CertaiNのプロフィール", 4 "flag_enabled": true 5}
なお実際にはデータベースに繋いでユーザ情報を取得してくることになると思いますが,全てのメソッドの中にPDOを扱う処理を毎回記述するのは非常に冗長なので,こういう処理は別のクラスにまとめておきましょう.そして,Slim\App
のインスタンスを作る際に渡すコンテナにあらかじめ突っ込んでおき,後から参照するようにしましょう.例えばこんな感じ.
(サービスロケータというアンチパターンを使っているんですが,まぁSlim3がそういう設計思想なのでしょうがないですね)
php
1$container = new Slim\Container; 2$container['db'] = function () { return new DB; }; 3 4$app = new Slim\App($container); 5$app->get('/user/profile/{name}', 'UserController:showProfile'); 6 7class UserController 8{ 9 private $db; 10 public function __construct(ContainerInterface $container) 11 { 12 $this->db = $container['db']; 13 } 14 public function showProfile($request, $response, $args) 15 { 16 $params = $request->getQueryParams(); 17 return $response->withJSON([ 18 'name' => $args['name'], 19 'description' => $this->db->getDescriptionByName($args['name']), 20 ]); 21 } 22} 23 24class DB 25{ 26 private $dbh; 27 public function __construct() 28 { 29 $this->dbh = new PDO(...); 30 } 31 public function getDescriptionByName($name) 32 { 33 $stmt= $this->dbh->prepare(...); 34 ... 35 return ...; 36 } 37}
投稿2016/03/25 14:17
編集2016/03/25 14:55総合スコア5223
0
なんだかよくわからないけど、
今私のレベルでは、ファイル分けて処理するしか思い浮かばずです。メソッドを分けて呼べる方法とかはありませんか??
パラメータでメソッドとかを指定すると同じファイルでも分けて処理ができるのかが知りたいことでした。
これですと、idとflgが同時に来るパターンはまた分岐するということでしょうか??
クラス化まではまだなので、さっぱりですが
という良い子のみんなの意見を纏めると、
apiTest.php
PHP
1if(isset($_GET["id")){ 2 doIdMethod($_GET["id"]); 3} 4 5if(isset($_GET["flg"])){ 6 doFlgMethod($_GET["flg"]); 7} 8 9function doIdMethod($id){ 10 // $idでの処理 11} 12 13function doFlgMethod($flg){ 14 // $flgでの処理 15}
こんなんでましたけど?
投稿2016/03/25 11:31
編集2016/03/25 11:35退会済みユーザー
総合スコア0
0
クラス化してみたら幸せになれるかも?
投稿2016/03/25 07:46
総合スコア2160
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/25 07:50
2016/03/25 07:57
2016/03/25 08:26
0
ん?
PHP
1if (@$_GET['flg'] == 1) { 2 // 1の処理 3} 4elseif ($_GET['flg'] == 2) { 5 // 2の処理 6} 7else { 8 // その他 9}
みたいな?
###追記
パラメータに値を付けると、HTTPプロトコルではGETでデータを受け取ることになります。
フォームなどにデータを入力してデータを受け取る場合、POSTでデータを受け取ります。
しかし、実はリクエストヘッダーの中身を見ると興味深いです。
flg=1&id=1234&name=suzuki ```のように渡しています。 そして、PHPはそのデータを直接利用することができます。 ```PHP $id = $_POST['id']; ```とするだけで、idを変数に入れて利用可能です。 これはURLパラメータでも同じです。
投稿2016/03/25 07:09
編集2016/03/26 03:50総合スコア4437
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/25 07:17
2016/03/25 07:19
2016/03/25 07:27
2016/03/25 07:38
2016/03/25 07:47
2016/03/25 14:22
2016/03/25 14:30
2016/03/26 03:51
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。