Как загрузить модели в расширенный класс MY_Router в codeigniter

Я не могу загрузить модели в расширенный класс My_Router в codeigniter. Ниже мой код:

class MY_Router extends CI_Router {

    function MY_Router()
    {
        parent::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;
        }

        // Let's check if there are category segments
    $category_routes = $this->category_routing($segments);
        if($category_routes !== FALSE)
    {
            return $category_routes;
        }
    $user_routes = $this->user_routing($segments);
    if($user_routes != FALSE)
    {
        return $user_routes;
    }

        show_404($segments[0]);
    }

    function category_routing($segments)
    {
        $this->load->model('category_model');
        if($this->category_model->category_exist($segments[0]))
        {
            //if only category
            if(count($segments)==1)
            {
                return array('category', 'category_browse', $segments[0]);  
            }
            //category pagination
            if(count($segments)==2 and is_numeric($segments[1]))
            {
                return array('category','category_browse', $segments[0], $segments[1]); 
            }
            //category upcoming
            if(count($segments)==2 and $segments[1] == 'upcoming')
            {
                return array('category','upcoming', $segments[0]);  
            }
            //category upcoming pagination
            if(count($segments)==3 and $segments[1] == 'upcoming' and is_numeric($segments[3]))
            {
                return array('category','upcoming', $segments[0], $segments[3]);    
            }
            //category top
            if(count($segments)==3 and $segments[1] == 'top')
            {
                return array('category','top', $segments[0], $segments[2]); 
            }
            //category top pagination
            if(count($segments)==4 and $segments[1] == 'top' and is_numeric($segments[3]))
            {
                return array('category','top', $segments[0], $segments[3]); 
            }
        }
        return FALSE;   
    }

    function user_routing($segments)
    {
        $this->load->model('dx_auth/users', 'user_model');
        if($this->user_model->check_username($segments[0]))
        {
            //only profile
            if(count($segments)==1)
            {
                return array('user','profile',$segments[0]);    
            }
            //all friends
            if(count($segments)==2 and $segment[1]=='allfriends')
            {
                return array('user','allfriends',$segments[0]); 
            }
            //all subscribers
            if(count($segments)==2 and $segment[1]=='allsubscribers')
            {
                return array('user','allsubscribers',$segments[0]); 
            }
            //all subscription
            if(count($segments)==2 and $segment[1]=='allsubscriptions')
            {
                return array('user','allsubscriptions',$segments[0]);   
            }
        }
        return FALSE;
    }
}

Я попытался загрузить модели с помощью функции get_instance, предоставленной codeigniter, но похоже, что она не работает. Все, что мне нужно, это загрузить модели в расширенную системную библиотеку.


person Yalamber    schedule 24.03.2010    source источник


Ответы (4)


Нет доступа к суперглобальному коду CodeIgniter до тех пор, пока не будет вызвана CI_Base, которая расширяется контроллером. Затем класс Controller загружает библиотеку Loader:

    // In PHP 5 the Loader class is run as a discreet
    // class.  In PHP 4 it extends the Controller
    if (floor(phpversion()) >= 5)
    {
        $this->load =& load_class('Loader');
        $this->load->_ci_autoloader();
    }

Маршрутизатор загружен очень долго (загляните в system/codeigniter/CodeIgniter.php, чтобы точно узнать, когда именно, в строке 99), поэтому почти ничего не доступно.

Вы можете использовать load_class('Что угодно'); загружать классы в другом порядке, но если вы не будете осторожны, это может сильно испортить ситуацию, и у вас все равно не будет доступа к драйверам базы данных.

В принципе, вы не можете сделать это таким образом. Вам нужно будет попробовать напрямую работать с библиотекой базы данных или использовать собственные привязки MySQL для доступа к вашим данным.

person Phil Sturgeon    schedule 25.03.2010
comment
Моим предложением было использование собственных привязок MySQL. Ты должен мне очко ;-) - person Phil Sturgeon; 28.03.2010

Вот что я сделал, и это сработало. Спасибо, Фил, за предложение.

class MY_Router extends CI_Router {

function MY_Router()
{
    parent::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;
    }

    // Let's check if there are category segments
    $category_routes = $this->category_routing($segments);
    if($category_routes !== FALSE)
    {
        return $category_routes;
    }
    $user_routes = $this->user_routing($segments);
    if($user_routes !== FALSE)
    {
        return $user_routes;
    }

    show_404($segments[0]);
}

function category_routing($segments)
{
    if($this->check_category_exist($segments[0]))
    {
        //if only category
        if(count($segments)==1)
        {
            return array('category', 'category_browse', $segments[0]);  
        }
        //category pagination
        if(count($segments)==2 and is_numeric($segments[1]))
        {
            return array('category','category_browse', $segments[0], $segments[1]); 
        }
        //category upcoming
        if(count($segments)==2 and $segments[1] == 'upcoming')
        {
            return array('category','upcoming', $segments[0]);  
        }
        //category upcoming pagination
        if(count($segments)==3 and $segments[1] == 'upcoming' and is_numeric($segments[3]))
        {
            return array('category','upcoming', $segments[0], $segments[3]);    
        }
        //category top
        if(count($segments)==3 and $segments[1] == 'top')
        {
            return array('category','top', $segments[0], $segments[2]); 
        }
        //category top pagination
        if(count($segments)==4 and $segments[1] == 'top' and is_numeric($segments[3]))
        {
            return array('category','top', $segments[0], $segments[3]); 
        }
    }
    return FALSE;   
}

function check_category_exist($cat_name)
{
    //connect to database and find the category
    include(APPPATH.'config/database'.EXT);
    $conn = mysql_connect($db['default']['hostname'],$db['default']['username'],$db['default']['password']);
    mysql_select_db($db['default']['database'],$conn);
    $sql = sprintf("SELECT COUNT(id) as count FROM categories WHERE permalink = '%s'", mysql_real_escape_string($cat_name));
    $query = mysql_query($sql);
    $row = mysql_fetch_object($query);
    mysql_close($conn);
    if($row->count)
    {
        return TRUE;
    }
    return FALSE;
}

function user_routing($segments)
{
    if($this->check_username_exist($segments[0]))
    {
        //only profile
        if(count($segments)==1)
        {
            return array('user','profile',$segments[0]);    
        }
        //all friends
        if(count($segments)==2 and $segments[1]=='allfriends')
        {
            return array('user','allfriends',$segments[0]); 
        }
        //all subscribers
        if(count($segments)==2 and $segments[1]=='allsubscribers')
        {
            return array('user','allsubscribers',$segments[0]); 
        }
        //all subscription
        if(count($segments)==2 and $segments[1]=='allsubscriptions')
        {
            return array('user','allsubscriptions',$segments[0]);   
        }
    }
    return FALSE;
}

function check_username_exist($username)
{
    //connect to database and find the category
    include(APPPATH.'config/database'.EXT);

    $conn = mysql_connect($db['default']['hostname'], $db['default']['username'], $db['default']['password']);
    mysql_select_db($db['default']['database'],$conn);
    $sql = sprintf("SELECT COUNT(id) as count FROM users WHERE username = '%s'", mysql_real_escape_string($username));
    $query = mysql_query($sql);
    $row = mysql_fetch_object($query);
    mysql_close($conn);
    if($row->count)
    {
        return TRUE;
    }
    return FALSE;
}

}

person Yalamber    schedule 27.03.2010

Следующий код также решит вашу проблему и сделает кодирование намного проще и гибче.

require_once( BASEPATH . 'database/DB' . EXT );
$db = & DB();
$query = $db->query("select ...");
$results = $query->result();
person Samik Chattopadhyay    schedule 25.05.2013

При использовании базового класса CodeIgniter во внешних библиотеках вы должны снова вызвать его следующим образом:

// load it
$CI =& get_instance();
$CI->load->model('model_name');

//use it
$CI->model_name->method()

надеюсь, это поможет

person James F    schedule 25.03.2010
comment
Он делает это в маршрутизаторе, используя get_instance(), что на раннем этапе вызовет фатальную ошибку. - person Phil Sturgeon; 25.03.2010
comment
да, Фил прав, я нашел выход, что я сделал, включил конфигурацию базы данных и подключился к моей базе данных с помощью функций php myslq и мог получить доступ к базе данных. я публикую свой код здесь. может быть, это было бы полезно для кого-то, кто пытается это сделать. - person Yalamber; 27.03.2010