SlimでHTTP OPTIONSメソッドのAllowヘッダを正しく実装するため、現在アクセスしているページに割り当てられているHTTPメソッドの一覧を取得したいと考えています。
Slimは扱ったことが無いため、コードを読みながら取得しようとしていますが、上手くいきません。
Slimで、現在アクセスしているページに割り当てられているHTTPメソッドの一覧を取得する方法はあるのでしょうか?
あるならば、どのような方法でしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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総合スコア697
0
Slimクラスのインスタンスの中にルータオブジェクトがありますから、その中を覗いてみるしかないんじゃないかなあ。
投稿2015/04/13 01:40
総合スコア973
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
覗いてみたのですが、そこには割り当てられた全てのHTTPメソッドがあり、私の求める「現在アクセスしているページに割り当てられているHTTPメソッドの一覧」を取得する方法は分かっていません。
URLのパターンと照合する箇所を見つけられれば、解決できるかも知れませんが…
Routerクラスのソースを読むのです。
読んで理解できるなら質問はしない。
ある程度処理を追い、それでも分からなかったから質問しています。
あらまあ...じゃあ、時間があるときに、こちらでソースを読んで探索するけど、とりあえず簡単なアイデアなど。
$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を見れば、あなたのしたいことができるのでは?

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/06 17:49