2017-11-01 1 views
0

自分のMVCについては、グローバル変数($_GETまたは$_SERVER)からリクエストURIを読み取る必要があります。リクエストURIの読み方は?

最初に私は$_GET配列からそれを読むと思った。しかしそれから、私はそれが$_SERVER配列にも含まれていることを発見しました。

したがって、どのグローバル配列からリクエストURIを読み込むべきか質問したいと思います。


例:と

http://local.mvc/PsrTest/testRequest/123?var=someval 

URIは、以下の構造を有することができ、コントローラ名として

  • PsrTest
  • testRequestをアクション名とします。
  • 123コントローラアクションの引数として。
  • var=somevalいくつかのクエリ文字列のキーと値のペア。 ".htaccessファイル" にRewriteRuleを適用することにより

、それに翻訳される。

http://local.mvc/index.php?url=PsrTest/testRequest/123&var=someval 

それは$_GET$_SERVERアレイの次の項目に保存されます:

------------ 
$_GET array: 
------------ 

'url' => 'PsrTest/testRequest/123' 
'var' => 'someval' 

--------------- 
$_SERVER array: 
--------------- 

'HTTP_REFERER' => 'http://local.mvc/PsrTest/testRequest/123?var=someval' 
'REDIRECT_QUERY_STRING' => 'url=PsrTest%2ftestRequest%2f123&var=someval' 
'REDIRECT_URL' => '/PsrTest/testRequest/123' 
'QUERY_STRING' => 'url=PsrTest%2ftestRequest%2f123&var=someval' 
'REQUEST_URI' => '/PsrTest/testRequest/123?var=someval' 

ありがとうございました!

+1

しないでください。ルーティングはPHPのままにしておいてください。すべてのWebサーバが.htaccessファイル(nginxやlighttpdなど)を持っているようなものではありません。 –

+1

私はこれに同意します。アノテーションを使用してこのメ​​ソッドを使用するには.htaccessを使用するのが最善の方法です。 Symfony MVCはこれを非常にうまく行います。独自のMVCを構築する場合は、このコードに参加して自分で使用することができます。 https://symfony.com/doc/current/routing.html –

+0

こんにちは、@tereškoとありがとう!つまり、私は 'RewriteRule'を適用すべきではありませんか?または、他の何か?あなたのアドバイスの背後にあるアイデアを理解するために少し説明してください。実際には、もっと言葉を置くことができる答えを高く評価しています。私のMVCでは、要求されたURIを構築し、それと 'ServerRequestInterface'(PSR-7)を実装し、コントローラアクションを呼び出す必要があるところです。その後のRewriteCond%{REQUEST_FILENAME} するRewriteCondの%{REQUEST_FILENAMEを} -d -f のRewriteRule^index.phpを[L] ' –

答えて

0

@tereskoが示唆したように、.htaccessは必ずしも可能ではありません。それから、少なくともRewriteRule.htaccessに書くことは、少なくとも私にとっては意味がなくなります。これは、指定されたURIをクエリ文字列パラメータに変換します。それはするのに十分であろう。

  • だけ.htaccessRewriteRule^index.php [L]のような単純なルールを、書きます。
  • PHPの$_SERVER['REQUEST_URI']の値を解析するだけで、コントローラのアクションを呼び出し、対応するパラメータを渡すために必要なURIコンポーネントを取得できます。

私は自分の答えを見つけるのを手伝ってくれたすべてのユーザーに感謝しています。ありがとう!

0

ただし、.htaccessを使用する場合は、これが最初です。

RewriteEngine On 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 

# One param 
RewriteRule ^/?([^/]*)$ index.php?section=$1 [NC,L] 

# Two params 
# IE: search/12345 
RewriteRule ^edituser/([a-zA-Z0-9]+)/?$ index.php?section=edituser&id=$1 [NC,L] 

# Three params 
# IE: search/12345/676767 
RewriteRule ^editcontact/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ index.php?section=editcontact&contactID=$1&reservationID=$2 [NC,L] 

これは、私が書いた古いプログラムの小さな例です。

+0

ありがとう、@ RobertSaylor。残念なことに、私はあなたとtereskoが私が... catchしないものに自分自身を参照していると思うので、(あなたのコメントでも)あなたが何を意味するのか分かりません:-)理論的に私はあなたと同じコードを持っています: 'RewriteRule ^(。+)$ index.php?url = $ 1 [QSA、L、B] '。そして、私は 'url'からそのキーと値のペアをすべて読み込んで解析することができます。しかし、例えば、私はまた、URIスキーム、ホスト、ポートなどを取得する必要があります –

+0

私の要求は、私は 'UriInterface'(PSR-7)を実装するために、要求されたURIを構築する必要があるところです。 'ServerRequestInterface'(PSR-7)を実装し、' ServerRequest'インスタンスを引数として渡してコントローラアクションを呼び出します。 –

+0

今は私にとってはすべてが明確です。 Tereskoは '.htaccess'は必ずしも可能性がないと示唆していました。そして私はあなたも思っていますが、私はあなたが両方とも意味していたことを最初に理解していませんでした:-)したがって、 'urlを' .htaccess'またはvirtualのクエリ文字列パラメータに変換する 'RewriteRule'ホスト。したがって、書き換えルールの責任を私のPHPコードに委ねます。あなたが実際にあなたの答えで提供したことは、私はPHPでプログラムするつもりです。しかし、私はあなたの答えと努力のためにもう一度あなたに感謝したい! :-) がんばろう。 –

関連する問題