2012-04-16 5 views
3

저는 CodeIgniter를 기반으로 CMS를 구축하고 있습니다. 뷰와 데이터를 데이터베이스에 저장하고 필요할 때 적절한 데이터를 수집합니다. 짐작 하시겠지만 각 페이지마다 물리적 컨트롤러와 일치하는보기를 생성 할 수는 없습니다.CodeIgniter - 숨겨진 컨트롤러

경로은 URL에 표시되는 컨트롤러를 사용하지 않아도되기 때문에 매우 편리 할 것이라고 생각했습니다. 부적절한 설명 : 실제 존재하는 컨트롤러에서 끝나지 않은 모든 요청을 사용자 지정 URL에 다시 지정하는 방법을 찾고 있는데, URL에 나타나지 않습니다.이 컨트롤러는 물론 404 오류 등을 처리합니다.

나쁜 : .com/handler/actual-view/) 양호 : (.com/actual-view/)가 (실제 뷰 컨트롤러가 존재하지 않는, 또는 대신 표시 줄)

내가 handler/를 가리키는 404_override 경로를 추가했습니다. 이제 요청한보기 (즉, .com/actual-view 실제보기는 내가 찾고있는 것임)를 찾는 방법을 찾고 있습니다.

나는 완전히 404-재 지정을 제거합니다

$route['404_override/(:any)'] = 'handler/$1'; 

과 유사한

을 시도했습니다.

답변

0

내 솔루션은 CodeIgniters 멋진 포럼과 StackOverflow의 멋진 멤버의 지침을 모두 따라 404 오류를 내 사용자 지정 컨트롤러로 라우팅하여 실제 404 (보기 또는 컨트롤러 없음)인지 확인했습니다. 나중에 제어기에서 필자는 데이터베이스 URI 문자열에서 필요한 나머지 정보를 수집합니다.

//Route 
$route['404_override'] = 'start/handler'; 

//Controller 
function handler($path = false) { 

    //Gather the URI from the URL-helper 
    $uri_string = uri_string(); 

    //Ensure we only get the desired view and not its arguments 
    if(stripos($uri_string, "/") !== false) { 
     //Split and gather the first piece 
     $pieces = explode("/", $uri_string); 
     $desired_view = $pieces[0]; 
    } else { 
     $desired_view = $uri_string; 
    } 

    //Check if there's any view under this alias 
    if($this->site->is_custom_view($desired_view)) { 

     //There is: ensure that the view has something to show 
     if(!$this->site->view_has_data($desired_view)) { 
     //No data to show, throw an error message 
     show_custom_error('no_view_data'); 
     } else { 
     //Found the views data: show it 
     } 

    } else { 
     //No view to show, lets go with 404 
     show_custom_404(); 
    } 
} 
0

당신은 당신이 당신의 응용 프로그램이 유연하고 여전히 CI 작동 방법을 준수 할 수 있도록 더 나은 그렇게함으로써 extending the base Router or Controller.

이 될 것입니다.

$route['u/(:any)/account'] = "user_profile/account/$1"; 
$route['u/(:any)/settings'] = "user_profile/settings/$1"; 
$route['u/(:any)/messages'] = "user_profile/messages/$1"; 
$route['u/(:any)'] = "user_profile/index/$1"; 

같은 : 내가 예를 제공해야하는 경우

+0

음 ... 정교하게 신경 쓰시겠습니까? – Zar

+0

그 문서에 대한 링크는 무엇을위한 것입니까? 특정 질문이 있으십니까? – Repox

+0

나는 실제로 일반적인 개념을 이해하지 못한다. 어떻게 나를 연장하는 것이 도움이 될까요? 어떻게 든로드 순서를 정의 할 수 없다면 (컨트롤러 -> 404 -> 컨트롤러 -> 사용자 정의 -> 404) ... 어떻게 정의 된 것인지 알 수는 없습니다 ... 잘못된 서클에서 생각할 수도 있습니다. -). – Zar

0

당신은 마지막 줄에 다음

$routes["(:any)"] = "specific controller path"; 

당신의 route.php 설정 파일에 유효한 경로를 모두 정의하고, 필요 여기에 표시된 것처럼 처음 세 사람이 그것을 잡을 수 없으면 모든 URL을 사용자 프로필로 전환하고 있습니다.

+0

이 컨트롤러는 실제로 기존 컨트롤러에서 끝나는 요청을 어떻게 수정합니까? 귀하의 제안은 모든 요청이 특정 컨트롤러에 의해 처리되도록합니다. – Repox

+0

아니요, 이전 경로가 catch 할 수없는 경우 URL을 특정 컨트롤러로 라우팅합니다. 내 응용 프로그램에서 직접 사용하고 있습니다. –

+0

이것은 내가 찾고있는 것을 수행하지만 솔직히 말하면 솔직히, 나는 대신 404_override 또는 유사한 것을 선호한다. (업데이트 된 OP를 보라). 답장을 보내 주셔서 감사합니다 :)! – Zar

관련 문제