2012-02-21 98 views
4

我動態加載通用函數中的模型,我注意到有時我想跳過加載模型,因爲它會引發404錯誤。如何檢查CakePHP是否存在Model?

如何檢查模型是否存在?

喜歡的東西:

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

您運行的是什麼版本的CakePHP? – cspray 2012-02-21 18:01:26

+0

http://cakephp.1045679.n5.nabble.com/How-to-tell-if-a-model-exists-td1317657.html – 2012-02-21 18:05:48

+0

這不能解決問題,因爲如果我嘗試初始化一個模型不存在,它仍然返回404 – Chobeat 2012-02-21 18:16:03

回答

8

既然你還沒有指定你的版本,我已經把我的答案分成兩部分,一部分爲1.3和1爲2.0。

CakePHP的1.3

loadModel()方法將返回false,如果它不能找到模型,看到API documentation。所以只是檢查它不返回假像:

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

請注意'loadModel ()'只存在於控制器中。在其他地方,使用'App :: import()'按照下面的標記回答。 – Costa 2012-03-11 01:43:08

+3

儘管文檔說明了這一點,但這並不適用於2.x。 Docs here:http://api.cakephp.org/2.4/class-Controller.html#_loadModel表示拋出異常,$ this-> loadModel()將返回false。然而,在進一步的檢查中,我發現一個Cake PHP的問題涉及這說文檔是錯誤的:https://cakephp.lighthouseapp.com/projects/42648/tickets/3664-Controller-loadModel-not-throwing-MissingModelException – k0nG 2013-06-19 09:24:10

+1

該文檔在模型總是被找到的意義上是錯誤的,因爲如果沒有模型文件,CakePHP會動態生成它們。就我個人而言,我覺得這很煩人。在很多情況下,您可以通過捕獲一個'MissingTableException'來改變它。 – eaj 2013-09-09 22:06:51

0

1.3可以使用

App::import('Model', 'ModelName'); 

返回假,如果不存在

它2.x中我沒有找到一個有效的解決方案尚未

3

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()。

1

我做了一個小的調整,亞當的功能,允許插件以及:

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');

$ this-> modelExists('Plugin.SomeModel');

$ this-> modelExists(['SomeModel']);

$ this-> modelExists(['Plugin','SomeModel']);

//注意使用數組()而不是[]如果你希望在PHP版本部署< 5.4

0

這對我的作品作爲蛋糕2

if (in_array($model, App::objects('Model'))) { 
    $this->loadModel($model); 
} else { 
    return 'error'; 
} 

通過App::objects('Model')它返回所有模型名稱作爲數組