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

РЕШЕНИЕ

Проблема заключается в том, что show_error(...) CodeIgniter отображает ошибку, а затем exit; … Не круто … Итак, я переопредел: model(...) -> my_model(..) (вы получите ошибки, если вы просто переопределите его) и удалили show_error(...) потому что по какой-то причине вы не можете переопределить его – странно для Codeigniter). Затем в my_model(...) он сделал бросок Исключения

Мое личное мнение: вызывающая функция должна return show_error("message"); где show_error возвращает FALSE — это или вы можете вывести exit; – и сделать show_error(...) overridable

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

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

Возможно, эта вспомогательная функция поможет вам проверить, загружена ли модель или нет.

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

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

Не допускайте, чтобы ваше приложение могло использовать 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; } } 

ура

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

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

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

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