PHP e Codeigniter – Como você verifica se existe um modelo e / ou não lança um erro?

Exemplo 1

bschaeffer's resposta bschaeffer's a esta pergunta – em seu último exemplo:

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

Como você lida com isso quando a 'table' não existe?


Exemplo # 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 } 

Mas ainda depois de executar isso (obviamente, o modelo não existe – mas, às vezes, ele) falhará com o seguinte erro:

um erro foi encontrado

Não é possível localizar o modelo que você especificou: serve_forms


Estou recebendo esta function chamada por:

1) Obtendo algum JSON:

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

2) E transformando-o na function chamada:

$ this-> load-> model (‘serve_’. “model_1”, ‘my_model’);

3) Onde eu chamo:

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

SOLUÇÃO

O problema reside no fato de que a function show_error(...) do CodeIgniter exibe o erro e exit; … Não é legal … Então eu overrode: model(...) -> my_model(..) (você receberá erros se você simplesmente o replace) e removeu o show_error(...) porque, por algum motivo você não pode substituí-lo – estranho para Codeigniter). Então, no my_model(...) , lançou uma Exceção

Minha opinião pessoal: a function de chamada deve return show_error("message"); onde show_error retorna FALSE — isso ou você pode tirar a exit; – e faça show_error(...) overridable

Você pode ver se o arquivo existe na pasta de modelos.

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

Talvez essa function auxiliar o ajude a verificar se um modelo está carregado ou não.

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

referência de fonte

Não faça questão de que sua aplicação possa usar pakages. Essa function auxiliar examina todos os modelos (mesmo em pacotes incluídos no seu aplicativo 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; } } 

Felicidades

@Endophage Não, você não precisa indicar explicitamente qual será o modelo que você está carregando. Eles podem ser carregados dinamicamente. Exemplo:

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

Então você pode ter um único controlador que use o URL ou POST vars.

Eu uso muito esse conceito com chamadas ajax. Então, a questão da OP é muito válida. Gostaria de me certificar de que o modelo existe antes de tentar carregar.