PHP和Codeigniter-如何检查模型是否存在和/或是否抛出错误? 示例#1
PHP和Codeigniter-如何检查模型是否存在和/或是否抛出错误? 示例#1,php,codeigniter,error-handling,Php,Codeigniter,Error Handling,Bchaeffer对问题的回答-在他的最后一个例子中: $this->load->model('table'); $data = $this->table->some_func(); $this->load->view('view', $data); 当'table'不存在时,您如何处理此问题 示例2 但运行此操作后(显然模型不存在,但有时会存在),它仍会失败,并出现以下错误: 遇到错误 找不到您指定的型号:SERVICE\U forms 我通过以下方式
Bchaeffer对问题的回答-在他的最后一个例子中:
$this->load->model('table');
$data = $this->table->some_func();
$this->load->view('view', $data);
当'table'
不存在时,您如何处理此问题
示例2
但运行此操作后(显然模型不存在,但有时会存在),它仍会失败,并出现以下错误:
遇到错误
找不到您指定的型号:SERVICE\U forms
我通过以下方式获得此函数调用:
1) 获取一些JSON:
2) 并将其转换为函数调用:
$this->load->model('SERVICE_u'、'model_1'、'my_model')
3) 我所说的:
解决方案
问题在于CodeIgniter的show_error(…)
函数显示错误,然后退出代码>。。。不酷。。。所以我重写了:model(…)
->my_model(…)
(如果你只是重写它,你会得到错误)并删除了show_错误(…)
,因为某些原因你不能重写它-对于Codeigniter来说很奇怪)。然后在my_model(…)
中使其抛出异常
我个人的意见:调用函数应该返回
显示错误(“消息”)代码>其中显示错误返回FALSE
——该或
您可以取出出口代码>-并使显示错误(…)
压倒
您可以查看“模型”文件夹中是否存在该文件
$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;
}
不要担心您的应用程序可能会使用包装。此帮助器功能可查看所有模型(即使在CI应用程序中包含的软件包中)
干杯@Endophage不,您不必明确说明正在加载的模型是什么。它们可以动态加载。
例如:
因此,您可以有一个使用URL或POST变量的控制器
我经常在ajax调用中使用这个概念。所以OP的问题很有道理。我想在尝试加载之前确保模型存在。这是有意义的(可能是我必须解决这个问题的方式),但这个函数用于生成一个将被大量使用的页面-我看到这会杀死服务器,每次它必须生成页面时,它都会强制进行此查询。。。另外,我不希望将所有模型都绑定到这里的一个文件夹中-最终我计划进一步分离我的模型,并且不想担心文件的位置。@Walter:您需要知道文件的位置才能加载它。@Rocket模型映射可以有模型所在的子目录。在这种情况下,您需要编辑您的代码片段。@true。我原以为load->model()函数会无声地失败。@沃尔特:如果文件不在同一台服务器上,你如何加载模型?顺便说一句,这里是CodeIngiter用来加载模型的代码:既然您必须手动将模型名称放在代码中的某个位置,为什么您要在知道文件不存在的情况下尝试加载模型?CI 2.x的包路径将允许您非常轻松地在目录结构中分发模型。E.X.-我想要model_1
的HTML,JSON:“model_1:{”pram_1:“1”,“pram_2:“1”}
->$this->load->model('service_.”“model_1”,“my_model”);
试图构建这个可扩展的系统我的观点仍然成立,你已经为“model_1”编程了“在你的代码中的某个地方,为什么不把它放在服务器上,在你的控制器中有一堆小包装函数呢?”。无论哪种方式,模型可能不存在的唯一情况是,如果所需的模型是通过用户生成的内容以某种方式请求的,这将有点疯狂…我明白你的意思-问题是,我尝试使它成为这样的程序员,他们对错误不像我那样敏感,可以在系统中构建内容。。。在这种情况下,“非编程人员”可能会更改原始JSON字符串,因此错误处理非常重要(至少在这个特定软件的早期版本中是如此),如果您还没有这样做,请投入一些时间来寻找替代的体系结构解决方案。听起来你以后会遇到真正的问题。Codeigniter已经提供了一种访问控制器及其功能的非常健壮的方法,听起来您只是试图将这种访问深入到模型中,而不是在控制器中编写一些简短的干净包装。如果它使代码更易于维护,那么编写更多的代码行是可以的,多写一点不会明显影响性能。我将此作为解决方案的基础。因为我已经有了一个MY_Loader类,我用它来添加不同的目录来存储模型,所以我向该类添加了一个新方法:[编辑超时]function model_exists($name){$CI=&get_instance();foreach($config_model_路径作为$config_路径)if(file_exists(FCPATH.$config_path.'models/'.$name..php'))return true;return false;}
至于“您怎么可能不知道您的模型文件是否存在?”这是一个具有站点特定模型和扩展名的框架,可能不适合添加到核心文件,但可能存在。
$this->my_model->function_name(pram_1=1, pram_2=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
}
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;
}
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;
}
}
$path = 'path/to/model/';
$model = 'My_model';
$method = '_my_method';
$this->load->model($path . $model);
return $this->$model->$method();