如何检查CakePHP是否存在Model?

时间:2012-02-21 17:57:50

标签: php cakephp

我在通用函数中动态加载模型,我注意到有时我想跳过加载模型,因为它会引发404错误。

如何检查模型是否存在?

类似的东西:

if($this->modelexists($type) {
  $this->loadModel($type);
} else {
  return "xxx";
}

4 个答案:

答案 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我还没找到可行的解决方案