开发者

PHP and Codeigniter - How do you check if a model exists and/or not throw an error?

开发者 https://www.devze.com 2023-03-27 09:51 出处:网络
Example #1 bschaeffer\'sanswer to this question - in his last example: $this->load->model(\'table\');

Example #1

bschaeffer'sanswer to this question - in his last example:

$this->load->model('table');
$data = $this->table->some_func();
$this->load->view('view', $data);

How do you handle this when 'table' doesn't exist?


Example #2

    try {
        $this->load->model('serve_' . $model_name, 'my_model');
        $this->my_model->my_fcn($prams);

        // Model Exists

    } catch (Exception $e) {
        // Model does NOT Exist
    }

But still after running this (obvously the model doesn't exist - but sometimes will) it fails with the following error:

An Error Was Encountered

Unable to locate the model you have specified: serve_forms


I am getting this function call by:

1) Getting some JSON:

"model_1:{"function_name:{"pram_1":"1", "pram_2":"1"}}

2) And turning it into the function call:

$this->load->model('serve_' . "model_1", 'my_model');

3) Where I ca开发者_开发百科ll:

$this->my_model->function_name(pram_1=1, pram_2=1);

SOLUTION

The problem lies in the fact that CodeIgniter's show_error(...) function displays the error then exit; ... Not cool ... So I overrode: model(...) -> my_model(..) (you'll get errors if you just override it) and removed the show_error(...) because for some reason you can't override it - weird for Codeigniter). Then in my_model(...) made it throw an Exception

My personal opinion: the calling function should return show_error("message"); where show_error returns FALSE --- that or you could take out the exit; - and make show_error(...) overridable


You can see if the file exists in the models folder.

$model = 'my_model';
if(file_exists(APPPATH."models/$model.php")){
   $this->load->model($model);
   $this->my_model->my_fcn($prams);
}
else{
  // model doesn't exist
}


Maybe this helper function will help you to check if a model is loaded or not.

function is_model_loaded($model)
{
    $ci =& get_instance();      
    $load_arr = (array) $ci->load;

    $mod_arr = array();
    foreach ($load_arr as $key => $value)
    {
        if (substr(trim($key), 2, 50) == "_ci_models")
            $mod_arr = $value;
    }
    //print_r($mod_arr);die;

    if (in_array($model, $mod_arr))
        return TRUE;

    return FALSE;
}

source reference


Don't foget that your application may use pakages. This helper function look through all models (even in packages included in your CI app).

if ( ! function_exists('model_exists')){
    function model_exists($name){
        $CI = &get_instance();
        foreach($CI->config->_config_paths as $config_path)if(file_exists(FCPATH . $config_path . 'models/' . $name . '.php'))return true;
        return false;
    }
}

Cheers


@Endophage No you do not have to explicitly state what the model you are loading will be. They can be loaded dynamically. Example:

$path = 'path/to/model/';
$model = 'My_model';
$method = '_my_method'; 
$this->load->model($path . $model);
return $this->$model->$method();

So you could have a single controller that uses the URL or POST vars.

I use this concept a lot with ajax calls. So OP's question is very valid. I would like to make sure that the model exists before I try to load it.

0

精彩评论

暂无评论...
验证码 换一张
取 消