2


0

codeigniterの拡張MY_Routerクラスでモデルをロードする方法

codeigniterの拡張My_Routerクラスにモデルを読み込むことができません。 以下が私のコードです:

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

codeigniterが提供するget_instance関数を使用してモデルをロードしようとしましたが、機能しないようです。 必要なのは、拡張システムライブラリにモデルをロードすることです。

4 Answer


3


Controllerによって拡張されるCI_Baseが呼び出されるまで、CodeIgniterスーパーグローバルへのアクセスはありません。 次に、Controllerクラスはローダーライブラリをロードします。

    // 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( 'Whatever');を使用できます。別の順序でクラスをロードしますが、注意していないと本当に物事を台無しにする可能性があり、データベースドライバーにアクセスできません。

基本的に、この方法ではできません。 データベースライブラリを直接操作するか、ネイティブMySQLバインディングを使用してデータにアクセスする必要があります。


0


ここに私がやったこととそれが働いた..提案のためにフィルに感謝します。

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

}


0


次のコードも問題を解決し、コーディングをより簡単で柔軟にします。

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


-1


外部ライブラリで基本CodeIgniterクラスを使用する場合、次のように再度呼び出す必要があります。

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

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

それが役立つことを願っています