CI Base URL Routing - PullRequest
       4

CI Base URL Routing

3 голосов
/ 20 июля 2010

Например, в Twitter вы можете использовать этот формат URL: http://twitter.com/username/

Имя пользователя для пользователя - "username".

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

Ответы [ 4 ]

4 голосов
/ 20 июля 2010

Расширьте класс маршрутизатора, поместив 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, хотя ...

3 голосов
/ 20 июля 2010

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

$route['404_override'] = 'users';
2 голосов
/ 20 июля 2010

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

http://twitter.com/u/username

Вы просто создаете контроллер с именем "U"

class U extends Controller{

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

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

0 голосов
/ 29 сентября 2014

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

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
        }
    }
}

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

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 / что угодно на your-domain.com / author / page / независимо от того, , только если контроллер с именем " Что бы ни "не существует. Если он существует, он получит доступ к контроллеру.

Кроме того, после всего этого, если вы хотите сделать что-то вроде your-domain.com / login для маршрутизации на your-domain.com / auth / login , вы можете сделайте это, добавив следующую строку в ваш config / rout.php

//...
$route['login'] = 'auth/login'; //add this line before the one specified above
$route['([a-zA-Z0-9_-]+)'] = 'author/page/$1';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...