我在通用函数中动态加载模型,我注意到有时我想跳过加载模型,因为它会引发404错误。
如何检查模型是否存在?
类似的东西:
if($this->modelexists($type) {
$this->loadModel($type);
} else {
return "xxx";
}
答案 0 :(得分:8)
由于你没有指定你的版本,我将我的答案分为两部分,一部分为1.3分,一部分为2.0分。
CakePHP 1.3
如果找不到模型,loadModel()
方法将返回false,请参阅API documentation。所以只需检查它不会返回false,如:
if(!$this->loadModel($type)) {
return "xxx";
}
CakePHP 2.0
如果模型类不存在,loadModel()
方法将抛出MissingModelException
,所以抓住它。
请参阅此处的API docs。
示例:
try {
$this->loadModel($type);
} catch(MissingModelException $e) {
// Model not found!
echo $e->getMessage();
}
答案 1 :(得分:4)
CakePHP 2.x
function model_exists($type){
$model_list = array_flip(App::objects('model'));
return isset($model_list[$type]);
}
您可以将此添加到AppController,并与& __ get()结合使用,以根据需要自动加载模型。在这种情况下,您可能希望使用成员变量(例如$ this-> model_list)来保存列表,这样您就不必每次都调用App :: objects()。
答案 2 :(得分:1)
我对Adam的功能进行了一些小调整以允许插件:
public function modelExists($modelClass, $plugin=null){
$object = 'model';
if($plugin){
$object = $plugin.'.'.$object;
}
$model_list = array_flip(App::objects($object));
return isset($model_list[$modelClass]);
}
还有一个问题。它似乎没有在Lib / Model目录中获取模型。
尚未能解决这个问题。如果我找到解决方案,将更新帖子。
我刚刚添加了对lib目录的支持
我还合并了插件和modelClass变量。(为方便起见,可以称为数组或字符串)
这是新功能:
public function modelExists($modelClass, $checkLoaded=true){
$modelClass = !is_array($modelClass)?$modelClass:implode('.', $modelClass);//implode if is array
list($plugin, $modelClass) = pluginSplit($modelClass, true);
$plugin=rtrim($plugin,'.');
$object = 'model';
if($plugin){
if($checkLoaded){
if(!CakePlugin::loaded($plugin)){
return false;
}
}
$object = $plugin.'.'.$object;
$libPaths = App::path("Lib/Plugin/$plugin");
} else {
$libPaths = App::path('Lib');
}
$list = App::objects($object, null, false);
foreach($libPaths as $path){
$libModels = App::objects('lib.'.$object, $path.'Model'.DS, false );
if(is_array($libModels)){
$list = Hash::merge($list, $libModels);
}
}
if(in_array($modelClass, $list)){
return true;
}
return false;
}
用法:
可以这样调用:
$这 - > modelExists( 'SomeModel');
$这 - > modelExists( 'Plugin.SomeModel');
$这 - > modelExists([ 'SomeModel']);
$ this-> modelExists(['Plugin','SomeModel']);
//注意使用array()而不是[]如果你希望在php版本上部署< 5.4
答案 3 :(得分:0)
for 1.3你可以使用
App::import('Model', 'ModelName');
如果不存在则返回false
对于2.x我还没找到可行的解决方案