2010-07-20 2 views
3

Например, в Twitter вы можете иметь этот формат URL: http://twitter.com/username/CI Базовый URL маршрутизации

С «именем» быть имя пользователя для пользователя.

Мне интересно, как правильно это сделать в Codeigniter. Мне нужен был бы тот же формат. У меня есть другие страницы, такие как управление учетными записями пользователей, и т. Д. Нужно ли мне маршрутизировать его через одну функцию, проверить, существует ли этот пользователь, а затем передать его на другой контроллер? Благодаря!

ответ

4

Расширение класса Router путем размещения MY_Router.php в вашем application\libraries директории и использовать этот код:

<?php 

class MY_Router extends CI_Router { 

    function _validate_request($segments) 
    { 
     // Does the requested controller exist in the root folder? 
     if (file_exists(APPPATH.'controllers/'.$segments[0].EXT)) 
     { 
      return $segments; 
     } 

     // Is the controller in a sub-folder? 
     if (is_dir(APPPATH.'controllers/'.$segments[0])) 
     {  
      // Set the directory and remove it from the segment array 
      $this->set_directory($segments[0]); 
      $segments = array_slice($segments, 1); 

      if (count($segments) > 0) 
      { 
       // Does the requested controller exist in the sub-folder? 
       if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT)) 
       { 
        show_404($this->fetch_directory().$segments[0]); 
       } 
      } 
      else 
      { 
       $this->set_class($this->default_controller); 
       $this->set_method('index'); 

       // Does the default controller exist in the sub-folder? 
       if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) 
       { 
        $this->directory = ''; 
        return array(); 
       } 

      } 

      return $segments; 
     } 

     // ** 
     // THIS IS THE NEW CODE BELOW 
     // ** 
     // It forces the segments to your known class (user) & method (index) 
     // for all controller calls that don't exist as files or inside 
     // directories 

     $my_segments = array('user', 'index', $segments[0]);  

     return $my_segments; 
    } 
} 

Теперь, просто создать User контроллер с индексным методом, который принимает имя пользователя в качестве первого параметра:

<?php 

class User extends Controller { 

    function index($username = '') 
    { 
     // Validate the HECK out of $username 
     // Validate the HECK out of $username 
     // VALIDATE THE HECK OUT OF $username 
     echo $username; 
     exit(); 
    } 

} 

Это ответ «мяч»! Протестировано по CI 1.7.2. Не знаю, о 2.0, хотя ...

+0

лол @ '// VALIDATE щеколда из $ username' – BoltClock

2

Было бы легко сделать что-то вроде этого:

http://twitter.com/u/username

Вы просто создать контроллер под названием «U»

class U extends Controller{ 

    function index($username){ 
     echo $username; 
    } 
} 

Если вы хотите в базовом URL, то еще что-то например, маршрутизация и т. д. У кого-то еще может быть это знание CI.

3

В CI 2.0 вы можете сделать это без каких-либо хаков, просто добавьте маршрут:

$route['404_override'] = 'users'; 
+0

ли это, обрабатывать все' show_404() 'звонки? – bschaeffer

+0

Ну, как только CI 2.0 выпущен, я буду использовать это. –

+0

Используйте 2.0 сейчас, все в порядке. Помните, что ExpressionEngine, MojoMotor и PyroCMS используют его, поэтому он не может быть таким неустойчивым. –

0

Предположим, у вас есть контроллер под названием «Автор», функция в нем называется «страница», которая получает в качестве параметра имени пользователя:

class Author extends CI_Controller { 

public function page($username = null) { 
    if($username == null) { //checking for forced url page load without username specified 
     //do a 404 redirect 
    } else { 
     $this->load->model('m_users'); 
     if($this->m_users->exists($username)) { // checking if requested username exists 

      //do stuff with the user here 

     } else { //otherwise redirect 
      //do a 404 redirect 
     } 
    } 
} 

тогда я хотел бы использовать следующий код в нижней части конфигурации/routes.php маршрут "your-domain.com/author/page/username " «your-domain.com/username»

if($handle = opendir(APPPATH.'/controllers')) { 
    while(false !== ($controller = readdir($handle))) { 
     if($controller != '.' && $controller != '..' && strstr($controller, '.') == '.php') { 
      $route[strstr($controller, '.', true)] = strstr($controller, '.', true); 
      $route[strstr($controller, '.', true).'/(:any)'] = strstr($controller, '.', true).'/$1'; 
     } 
    } 
    closedir($handle); 
} 
$route['([a-zA-Z0-9_-]+)'] = 'author/page/$1'; 

это будет маршрут любой запрос вида your-domain.com/whatever к your-domain.com/author/page/whatever только если Контроллер с именем «Whatever» не существует. Если он существует, он получит доступ к контроллеру.

В ADITION, после всего этого, если вы хотите сделать что-то вроде your-domain.com/login на пути к your-domain.com/auth/login вы можете сделать это, добавив следующую строку к вашему конфигурации/routes.php

//... 
$route['login'] = 'auth/login'; //add this line before the one specified above 
$route['([a-zA-Z0-9_-]+)'] = 'author/page/$1'; 
Смежные вопросы