2011-10-01 3 views
6

Codeigniter 경로에 문제가 있습니다. 내 사이트의 모든 등록 된 사용자가 자신의 "디렉토리"를 가져오고 싶습니다 (예 : www.example.com/username1, www.example.com/username2). 이 "디렉토리"는 컨트롤러 "polica", 메소드 "ogled", 매개 변수 "username1"에 매핑되어야합니다.Codeigniter의 경로 - 자동

이렇게하면 각 컨트롤러가 "polica/ogled/parameter"경로에 매핑됩니다.

$route["(:any)"] = "polica/ogled/$1"; 

이 작동하지만, 난 항상 수동으로 routes.php에 정보를 입력 한 : 그것은 OK 아니라이

$route["username1"] = "polica/ogled/username1"; 

자동화됩니다 어떻게 그렇게 할 수 있습니까?

업데이트 : 예를 들어 컨트롤러 이름은 ads입니다. 예를 들어 www.example.com/ads/ 으로 이동하면 광고가 표시됩니다. 당신은 www.example.com/username1로 이동하면 사용자가 username1에 의해 나열된 광고가 있습니다. 또한 컨트롤러 user, profile, latest, ...이

내 현재 routes.php :

이 코드로 문제를 해결
$route['oglasi'] = 'oglasi'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

: 마리오

,

$route['oglasi/(:any)'] = 'oglasi/$1'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

감사

+0

브릴리언트! 난 그냥 기본 컨트롤러와 함께이 일을 거기뿐만 아니라 작동합니다. –

답변

23

당신의 경로에 대한 문제는 다음과 같은 것을 사용하는 것입니다 : 당신이 실제로 매치하는 모든 경로 ... 그래서 당신은 꽤 많이 붙어 있습니다. 그들은을 읽을 이후

$route['aboutus'] = "aboutus"; 
$route['where-we-are'] = "whereweare"; 
//And do this for all your site's controllers 
//Finally: 
$route['(:any)'] = "polica/ogled/$1"; 

모든 노선은 어떤 앞에 와야합니다 : 당신은 선택적으로 다시 경로의 모든 사이트 컨트롤러를 개별적으로, 같은 수)

1 : 나는 당신이 두 가지 솔루션을 가지고 있다고 생각 그들이 제시된 순서, 그리고 당신이 : 처음에 모든 것을 놓으면 행복하게 모든 것을 건너 뛸 것입니다. 코멘트 후

편집 : 당신은 어떤 세그먼트에 맞게려고하는 경우에

내 말은있다, 이것은 당신이 기본적으로 모든에서 어떤 컨트롤러 (첫 번째 URI를 사용할 수 있다는 것을 의미한다 세그먼트), 라우터는 항상 귀하의 정의 된 법률을 사용하여 경로를 변경합니다. CI가 다른 컨트롤러를 실행할 수있게하려면 (내가 무엇이든간에, 몇 가지 일반적인 웹 페이지를 사용했지만 문자 그대로 가능할 수 있음) 리 라우팅에서 제외해야합니다. 그리고 당신은 ANY 규칙 앞에 배치하여 이것을 얻을 수 있습니다. 그래서 CI가 라우팅 규칙을 통과 할 때마다 먼저 "탈출"한 구문을 분석하고 URL에서 찾은 것과 일치하지 않는 경우에만 통과합니다 에 : 어떤 규칙.

그럼에도 불구하고이 코드는 간결함을 알고 있습니다.하지만 여러분이 말했듯이 그들은 분명히 6K 미만입니다. URL과 웹 애플리케이션의 실제 구조를 알지 못하기 때문에 이것이 내 마음에 오는 유일한 해결책입니다.당신은 당신의 응용 프로그램의 정규 URL을 형성하는 방법 등의 자세한 정보를 제공하는 경우, 나는 내 대답 업데이트 할 수 있습니다

/최종 편집

그것은을 필요로하기 때문이 많이 pratical 해결책이 아니다 코드가 많이 있지만, 그런 식으로 디자인을 원한다면 내 마음에 오는 유일한 방법입니다. 또한 $ 경로 색인으로 regexes를 사용할 수 있다고 생각하지만이 방법으로는 사용자 이름이 일치하지 않을 가능성이 있기 때문에 여기서는 작동하지 않을 것이라고 생각합니다.하지만 그 가능성을 지적하고 싶습니다.

또는

2) 당신은 매우 매우 (그리고 의미) URL을 생성합니다

$route['user/(:any)'] = "polica/ogled/$1"; 

이의 라인을 따라 뭔가를 사용자 이름에 다른 경로를 약간 디자인 패턴을 변경하고 할당 할 수 있습니다 그럼에도 불구하고 다른 루트를 벗어나는 모든 번거 로움을 피할 것입니다.

+0

답장을 보내 주셔서 감사합니다. 내 고객이 도메인 이름 뒤에 사용자 이름을 갖고 싶어하기 때문에 두 번째 솔루션을 사용할 수 없습니다.나는 당신의 첫 번째 해결책을 이해하지 못합니다. 제 경우에 설명해 주시겠습니까? 내 목표는 적은 코드로이 문제를 해결하는 것입니다. 이제,'routes.php' 파일에 약 6000 개의 행이 있습니다. -/ – Puzo

+0

@Puzo 첫 번째 해결책에 대한 설명으로 내 대답을 업데이트했습니다. 그리고 예, 6000 개의 경로가 너무 많습니다. –

+0

나는 나의 첫번째 포스트 질문을 업데이트했다. 더 많은 정보가 필요 하신가요? 어떤 종류? – Puzo

1

나는 최근이 같은 문제로 어려움을 겪고있었습니다. 나는 이런 식으로 나를 위해 일한 것을 만들었습니다.

remap 방법으로 "리디렉션"컨트롤러를 정의하십시오. 이렇게하면 모든 가변 문자열을 가진 contoller로 보내진 요청을 하나의 함수로 모을 수 있습니다. 따라서 http://yoursite/jeff/ 또는 http://yoursite/jamie으로 요청을 보내면 해당 방법에 도달하지 않고 대신 http://yoursite/ 다시 매핑 기능을 누르십시오. (비록 그 메소드들/이름들이 존재하지 않더라도 당신이 인덱스 함수를 가지고있다하더라도 그것을 대체한다). _Remap 메서드에서 조건부 스위치를 정의하면 나머지 코드와 함께 사용자가 원하는 방향으로 사용자를 리디렉션 할 수 있습니다.

그런 다음, 디폴트로이 다시 직접 컨트롤러를 정의하고 다음처럼 경로를 설정해야합니다

:

$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

이 기본적으로 모든 것을 강제하기 때문에이 문제의 첫 번째 비트에있다 다시한다 무엇이든 궁극적 으로이 컨트롤러를 _remap 스위치를 통해 지시했다.

하지만 할 수있는 일은 해당 경로 문 위에이 조건을 따르고 싶지 않은 규칙/경로를 정의하는 것입니다.

즉이

$route['myroute'] = "myroute"; 
$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

나는 이것이 내가 쉽게 하나의 컨트롤러를 통해 약자 내용에 따라 리디렉션 할 수 있어요 어디 정의되어 많은 변수를 사용자가 할 수있는 좋은 시스템을 생산하는 것을 발견했다.

+0

흠 .. 올바르게 이해한다면,'routes.php' 파일에 모든 컨트롤러를 정의해야하고, 그 아래쪽에서 리디렉션 규칙을 정의해야합니까? 페이지의 성능에 영향을 줍니까? – Puzo

+0

@Puzo 의견을 읽고, 내 답변에서 말하려고했던 것입니다. –

+0

@Chamilyan 어떻게 URL을 라우팅과 함께 바꿀 수 있습니까? – Bugfixer

1

또 다른 방법은 intenal 컨트롤러와 배열을 선언 이그나이터에서 routes.php 파일에서이 같은 사용자의 컨트롤러에 다른 모든 리디렉션 될 것이다 :

$controllers=array('admin', 'user', 'blog', 'api'); 
if(array_search($this->uri->segment(1), $controllers)){ 
    $route['.*'] = "polica/ogled/$1"; 
}