2017-11-01 13 views
0

내 MVC에 대해서는 전역 변수 ($_GET 또는 $_SERVER)에서 요청 URI를 읽어야합니다.요청 URI를 읽는 방법은 무엇입니까?

먼저 $_GET 배열에서 읽는 것으로 생각했습니다. 그러나 그 다음에 나는 배열이 $_SERVER 배열에도 포함되어 있다는 것을 발견했습니다.

그렇다면 요청 URI를 어느 전역 배열에서 읽어야할까요?


예 :

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

와 :

URI가 다음의 구조를 가질 수

  • PsrTest 컨트롤러 이름 등을;
  • testRequest으로 작업 이름;
  • 123 컨트롤러 동작의 인수로;
  • var=someval 일부 쿼리 문자열 키/값 쌍; $_GET$_SERVER 배열의 다음 항목에

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

    과 저장됩니다 : "htaccess로"에 RewriteRule을 적용하여

, 그것은으로 변환됩니다

------------ 
$_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로 두어야합니다. 모든 웹 서버가 .htaccess 파일 (nginx 및 lighttpd)을 가지고있는 것과는 다릅니다. –

+1

동의합니다. .htaccess를 사용하여 주석을 사용하여이 방법을 사용하는 것이 최선의 방법입니다. Symfony MVC가이를 잘 처리합니다. 자신 만의 MVC를 작성한다면이 코드에 참여하여 스스로 사용할 수 있어야합니다. https://symfony.com/doc/current/routing.html –

+0

안녕하세요, @ tereško 및 감사합니다. 즉,'RewriteRule'을 적용해서는 안됩니다. 또는 다른 것? 조금 설명해 주실 수 있으시겠습니까? 귀하의 조언 뒤에있는 아이디어를 이해할 수 있습니까? 실제로 나는 더 많은 말을 할 수있는 대답을 많이 주셔서 감사합니다. MVC의 경우 요청 된 URI를 만들고 거기에'ServerRequestInterface' (PSR-7)을 구현하고 컨트롤러 액션을 호출해야하는 시점에 있습니다. –

답변

0

@teresko가 제안한대로 .htaccess이 항상 가능한 것은 아닙니다. 그렇다면 RewriteRule.htaccess에 작성하여 주어진 URI를 쿼리 문자열 매개 변수로 변환하는 것이 더 이상 의미가 없습니다.

  • 그냥 RewriteRule^index.php [L].htaccess처럼, 간단한 규칙을 작성할; 그것은 충분히하는 것
  • 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

고맙습니다. @ 로버트 시일러. 불행하게도 나는 당신과 Teresko가 내가하지 않는 것에 너 자신을 언급한다고 생각하기 때문에 (당신의 의견도 아니다) 당신이 의미하는 것을 확신하지 못한다 ... :-) 이론적으로 나는 당신과 비슷한 코드를 가지고있다 :'RewriteRule^(. +) $ index.php? url = $ 1 [QSA, L, B]'. 그리고 나는'url'에서 모든 키/값 쌍을 읽고 파싱 할 수 있습니다. 하지만, 예를 들어 URI 스키마, 호스트, 포트 등을 가져와야합니다. –

+0

MVR의 경우, UriInterface (PSR-7)를 구현하기 위해 요청 된 URI를 빌드해야하는 시점에 있습니다. (ServerRequestInterface) (PSR-7)을 구현하고 컨트롤러 액션을 호출하여 'ServerRequest' 인스턴스를 인수로 전달합니다. –

+0

이제 나에게 분명하다. Teresko는'.htaccess'가 항상 가능성은 아니라고 제안했습니다. 그리고 저는 여러분도 생각합니다. 그러나 저는 여러분 모두가 의미하는 바를 먼저 이해하지 못했습니다 :-) 그래서 주어진 uri를'.htaccess' 또는 virtual의 쿼리 문자열 매개 변수로 변환하는'RewriteRule'을 작성하는 것이 더 이상 의미가 없습니다 숙주. 따라서 다시 작성 규칙 책임을 PHP 코드에 위임합니다. 당신이 실제로 대답으로 제공 한 것은 PHP로 프로그래밍 할 것입니다. 그러나 귀하의 답변과 노력에 다시 한 번 감사드립니다! :-) 행운을 빕니다. –