2013-04-06 4 views
0

У меня есть базовый контроллер (base), из которого все остальные контроллеры расширяются. Все, что размещено здесь, переопределит другие контроллеры, здесь будут перенаправлены.Codeigniter - сегмент URL заменить или перенаправить

URL, например:

http://domain.com/controllerone/function 
http://domain.com/controllertwo/function 
http://domain.com/controllerthree/function 

Используя код, приведенный ниже. даст мне имя контроллера

$this->uri->segment(1); 

Каждый из вышеуказанных контроллеров должны быть перенаправлены на отдельные адреса, но Funcation часть не должна измениться:

http://domain.com/newcontrollerone/function 
http://domain.com/newcontrollertwo/function 
http://domain.com/newcontrollerthree/function 

В моем регуляторе я хочу следующую логику :

$controller_name = $this->uri->segment(1); 

    if($controller_name === 'controllerone'){ 
     // replace the controller name with new one and redirect, how ? 
    }else if($controller_name === 'controllertwo'){ 
    // replace the controller name with new one and redirect, how ? 
    }else{ 
     // continue as normal 
    } 

я думал, я должен использовать redirect() функцию и str_replace(), но не знаю, насколько эффективно это будет. В идеале я не хочу использовать класс Routing.

спасибо.

ответ

0

CodeIgniter's URI Routing, должен быть в состоянии помочь в этом случае. Однако, если у вас есть веская причина не использовать его, то это решение может помочь.

Потенциальные перенаправления в массиве, где ключ является имя контроллера разыскиваются в URL и значениеэто имя контроллера для перенаправления. Это может быть не самый эффективный, но я считаю, что его проще управлять и читать, чем потенциально очень длинный оператор if-then-else.

//Get the controller name from the URL 
$controller_name = $this->uri->segment(1); 
//Alternative: $controller_name = $this->router->fetch_class(); 

//List of redirects 
$redirects = array(
    "controllerone" => "newcontrollerone", 
    "controllertwo" => "newcontrollertwo", 
    //...add more redirects here 
); 

//If a redirect exists for the controller  
if (array_key_exists($controller_name, $redirects)) 
{ 
    //Controller to redirect to 
    $redirect_controller = $redirects[$controller_name]; 
    //Create string to pass to redirect 
    $redirect_segments = '/' 
         . $redirect_controller 
         . substr($this->uri->uri_string(), strlen($controller_name)); //Function, parameters etc. to append (removes the original controller name) 
    redirect($redirect_segments, 'refresh');  
} 
else 
{ 
    //Do what you want... 
} 
+0

спасибо за ответ, если это будет 'redirect ($ redirect_url, 'refresh');' >> 'redirect ($ redirect_segments, 'refresh');'? – TheDeveloper

+0

Да, должно быть, извините! – jleft

+0

все кажутся мне полезными, спасибо – TheDeveloper

1

попробовать

header("Location:".base_url("newcontroller/".$this->uri->segment(2))); 
+1

Я думаю, что 'редирект ('newcontroller /'.$ this-> uri-> сегмент (2)),' бы более идиоматических с CodeIgniter. – complex857

1

Простое решение с помощью segment_array:

$segs = $this->uri->segment_array(); 

if($segs[1] === 'controllerone'){ 
    $segs[1] = "newcontroller"; 
    redirect($segs); 
}else if($segs[1] === 'controllertwo'){ 
    $segs[1] = "newcontroller2"; 
    redirect($segs); 
}else{ 
    // continue as normal 
} 
Смежные вопросы