PHP и Codeigniter - Как вы проверяете, существует ли модель и/или не выдает ошибку?

Пример # 1

bschaeffer's ответьте на этот вопрос - в своем последнем примере:

$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(...)переопределение

Ответ 1

Вы можете увидеть, существует ли файл в папке моделей.

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

Ответ 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;
}

ссылка источника

Ответ 3

Не забудьте, что ваше приложение может использовать pakages. Эта вспомогательная функция просматривает все модели (даже в пакетах, включенных в ваше приложение 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;
    }
}

Приветствия

Ответ 4

@Endophage Нет, вам не нужно явно указывать, какую модель вы загружаете. Они могут загружаться динамически. Пример:

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

Таким образом, у вас может быть один контроллер, который использует URL или POST файлы.

Я использую эту концепцию много с вызовами ajax. Поэтому вопрос OP очень важен. Я хотел бы убедиться, что модель существует, прежде чем я попытаюсь загрузить ее.