PHP和Codeigniter - 如何检查模型是否存在和/或不抛出错误?

时间:2011-08-10 21:06:11

标签: php codeigniter error-handling

示例#1

bschaeffer's回答this问题 - 在他的最后一个例子中:

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

如果'table'不存在,您如何处理?


示例#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
    }

但是在运行之后(显然模型不存在 - 但有时会存在)它失败并出现以下错误:

  

遇到错误

     

无法找到您指定的模型:serve_forms


我通过以下方式调用此函数:

1)获得一些JSON:

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

2)并将其转换为函数调用:

  

$ this-> load-> model('serve_'。“model_1”,'my_model');

3)我打电话的地方:

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

问题在于CodeIgniter的show_error(...)函数显示错误然后exit; ...不酷...所以我覆盖:model(...) - > my_model(..)(如果你只是覆盖它就会出错)并删除show_error(...)因为某些原因你不能覆盖它 - 对Codeigniter来说很奇怪)。然后在my_model(...)中使它抛出异常

  

我的个人意见:调用函数应该return show_error("message"); show_error返回FALSE ---或者   你可以取出exit; - 然后制作show_error(...)   重写

4 个答案:

答案 0 :(得分:17)

您可以查看模型文件夹中是否存在该文件。

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

答案 1 :(得分:2)

也许这个辅助函数可以帮助您检查是否加载了模型。

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

答案 2 :(得分:1)

不要忘记您的应用程序可能会使用包。这个辅助函数可以查看所有模型(甚至可以在CI应用程序中包含的包中)。

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

干杯

答案 3 :(得分:0)

@Endophage不,您不必明确说明您要加载的模型是什么。它们可以动态加载。 例如:

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

所以你可以拥有一个使用URL或POST vars的控制器。

我在ajax调用中经常使用这个概念。所以OP的问题非常有效。在尝试加载模型之前,我想确保模型存在。