2011-10-07 5 views
0

URL에서 컨트롤 이름을 가져 와서 index.php에서 올바른 컨트롤러와 동적으로 일치 시키려고합니다.PHP 프론트 컨트롤러를 사용한 동적 라우팅

내 응용 프로그램 루트 : /localhost/app/index.php

그래서 기본적으로 내가 home_controller.php을 inlude하려고 /localhost/app/index.php/home를 입력 할 때. 다음은 코드입니다.

$parts = array_slice(explode('/',$_SERVER["REQUEST_URI"]),3); 
if(file_exists(dirname(__FILE__)."/controllers/".$parts[0].'_controller.php')) 
{ 
    include dirname(__FILE__)."/controllers/".$parts[0].'_controller.php'; 
} 

응용 프로그램 루트 깊이는 내가 같은 응용 프로그램 디렉토리를 변경하는 경우 (3)이이 생겼습니다 경우 그것은 잘 작동 로컬 호스트/1 차/2 차/응용 프로그램/index.php에/홈

는 3에 의해 폭발 있기 때문에, $ parts [0]은 더 이상 "home"이 아닙니다. 질문은 컨트롤러 부분을 어떻게보다 효율적으로 감지 할 수 있습니까?

답변

0

$ _SERVER paht_info 변수를 사용했습니다. 컨트롤러 부분 ..

$segments = array_slice(explode("/", $_SERVER["PATH_INFO"]),1); 

$ 세그먼트 배열의 제로 인덱스는 컨트롤러 부분이고 다른 부분은 기능입니다. Btw에서는 배열 경계를 검사하고 path_info가 설정되어 있는지 여부를 확인해야합니다.

0

/localhost/app/index.php/home 로컬 호스트/1 차/2 차/응용 프로그램/index.php에/홈 는이 $ 부품 [0] 조각 앱/index.php에 같이 당신의 문자열을 같은 소리/잘못된 길입니다. 이 문제를 처리하는 유일한 방법은 /를 구분 기호로 사용하여 해당 문자열을 분해하거나 배열의 마지막 배열을 비교하거나 각각을 통해 실행할 위치로 사용하는 것입니다. MVC의 개념은 URL이 항상 컨트롤러를 결정하는 데 필요한이 경우에는 비슷한 부분으로 구성되어 있습니다. 2+는 일반적으로 컨트롤러의 함수에 매개 변수에 대한 참조로 사용됩니다.

+0

그런데 codeigniter를 사용하고 있습니까? – chris

+0

감사합니다. 나는 CI를 사용하지 않는다. "/"로 폭발 한 후에도 localhost, first, second, app, index.php, home을 갖습니다. 올바른 컨트롤러를 찾기 위해이 배열을 반복하고 싶지 않습니다. 볼 수 있듯이, 효율적이지 않습니다. 또한 URL이 localhost/first/second/app/index.php/home/settings 인 경우 역방향으로 실행하면 어떻게됩니까? 방금 홈 컨트롤러의 설정 기능을 호출하고 싶습니다. @ chris –

+0

Im는 약간의 미친 일을 생각하고 있습니다. 어떤 것이 당신의 최종 게임이 될지도 모르는 것을 위해 잘 작동하지 않을 것입니다. – chris

관련 문제