質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Slim

SlimはPHPアプリケーションを開発するための軽量なマイクロフレームワークです。

Q&A

解決済

2回答

3184閲覧

Slimで、現在のパスで扱えるHTTPメソッドの一覧を取得したい

sounisi5011

総合スコア697

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Slim

SlimはPHPアプリケーションを開発するための軽量なマイクロフレームワークです。

0グッド

1クリップ

投稿2015/04/13 00:57

SlimでHTTP OPTIONSメソッドのAllowヘッダを正しく実装するため、現在アクセスしているページに割り当てられているHTTPメソッドの一覧を取得したいと考えています。
Slimは扱ったことが無いため、コードを読みながら取得しようとしていますが、上手くいきません。

Slimで、現在アクセスしているページに割り当てられているHTTPメソッドの一覧を取得する方法はあるのでしょうか?
あるならば、どのような方法でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

最終的に、以下の様な処理を行うことにしました。
他にいい方法があれば解答ください。

lang

1$app->options( 2 '/.*', 3 function()use($app){ 4 /** 5 * 現在のURLで利用できるHTTPメソッドの一覧を取得する 6 */ 7 $methods=[]; 8 $router=$app->router(); 9 $url=$app->request->getResourceUri(); 10 foreach(['HEAD','GET','POST','PUT','PATCH','DELETE'] as $method){ 11 $methods=array_merge( 12 $methods, 13 array_reduce( 14 $router->getMatchedRoutes($method,$url,true), 15 function($carry,$route){ 16 return array_merge( 17 $carry, 18 $route->getHttpMethods() 19 ); 20 }, 21 [] 22 ) 23 ); 24 } 25 $methods=array_values(array_unique($methods)); 26 27 /** 28 * HTTPメソッドが無い場合、現在のURLに対応するルーターは存在しないため 29 * 404 Not Foundとする 30 */ 31 if($methods===[]){ 32 $app->notFound(); 33 } 34 35 /** 36 * PHPによる自動gzip圧縮を無効化 37 */ 38 ini_set('zlib.output_compression','off'); 39 40 /** 41 * Allowヘッダを送信 42 */ 43 $app->response->headers->set('Allow',implode(',',$methods)); 44 45 /** 46 * Content-Typeヘッダを省略 47 */ 48 $app->response->headers->set('Content-Type',''); 49 } 50);

なお、このコードはPHP5.4で導入された配列の短縮構文を利用しています。

投稿2015/04/17 13:20

編集2015/04/17 13:48
sounisi5011

総合スコア697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sounisi5011

2016/06/06 17:49

この質問で想定しているSlimはv2のものです。 Slim 3からは、内部的にnikic/FastRouteを採用したため、Allowヘッダの指定に必要な、 「割り当てられているHTTPメソッドの一覧」の配列データを容易に取得できます。 というより、初期状態のSlim 3が備えるSlim\Handlers\NotAllowedクラスが、適切なAllowヘッダを自動で出力してくれるようにできています。 この回答みたいな面倒な事を避けるためにも、Slim 3の使用を薦めます。
guest

0

Slimクラスのインスタンスの中にルータオブジェクトがありますから、その中を覗いてみるしかないんじゃないかなあ。

投稿2015/04/13 01:40

chokojori

総合スコア971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sounisi5011

2015/04/13 06:26

覗いてみたのですが、そこには割り当てられた全てのHTTPメソッドがあり、私の求める「現在アクセスしているページに割り当てられているHTTPメソッドの一覧」を取得する方法は分かっていません。 URLのパターンと照合する箇所を見つけられれば、解決できるかも知れませんが…
chokojori

2015/04/13 07:23

Routerクラスのソースを読むのです。
sounisi5011

2015/04/13 11:17

読んで理解できるなら質問はしない。 ある程度処理を追い、それでも分からなかったから質問しています。
chokojori

2015/04/13 22:24

あらまあ...じゃあ、時間があるときに、こちらでソースを読んで探索するけど、とりあえず簡単なアイデアなど。 $app = new \Slim\Slim(); $app->get('/hello/:name', function($name){ echo 'Hello, ', $name; }); とかするでしょ。 そこで、$app->getをラップする関数を書いたらどうかな。 $ROUTING = array(); function add_get($app, $url, $func) { global $ROUTING; if (! array_key_exists($ROUTING[$url])) { $ROUTING[$url'] = array(); } $ROUTING[$url'][] = "GET"; $app->get($url, $func); } add_post, add_putなども同じように定義して、 add_get($app, '/hello/:name', function($name){ echo 'Hello, ', $name; }); こういう風に使えば、$ROUTINGを見れば、あなたのしたいことができるのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問