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

Пример # 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(...) переопределенным

Ответы [ 4 ]

17 голосов
/ 11 августа 2011

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

$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 голосов
/ 29 октября 2012

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

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

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

1 голос
/ 23 октября 2013

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

Приветствия

0 голосов
/ 29 октября 2013

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...