Cakephp проверяет, существует ли модель

Я создаю приложение, в котором использую два плагина. Для будущего использования я хочу проверить, используются ли два плагина вместе или по отдельности. Мне нужно проверить, существует ли модель, и если да, то выполнить какую-то логику, а если нет - нет. Если я попробую if($this->loadModel('Model')) { etc }, я получу сообщение об ошибке, в котором говорится, что модель не существует, чего я и хочу, но я не хочу, чтобы ошибка препятствовала выполнению логики.

В основном я хочу:

if(Model->exists()) { do->this } else { do->somethingelse }

Я попытался использовать функцию php class_exists(), но она возвращает false независимо от того, существует ли модель или нет.


person Manu    schedule 29.06.2011    source источник


Ответы (2)


Я бы использовал App::objects('model') начиная с версии 2.x (не знаю, когда это было реализовано).

class AppController extents Controller {   
   private function _modelExists($modelName){
      $models = App::objects('model');
      return in_array($modelName,$models);
   }    
}

//Somewhere in your logic
if($this->_modelExists('SomeModel')){
   //do model exists logic
} else {
   //do other logic
}

*Обратите внимание, что App::objects('model') не будет включать модели из плагинов. Вы можете сделать:

$models = array_merge(
   App::objects('model'),
   App::objects('MyPlugin.model')
);

Вы также можете сделать это с чистым php следующим образом

if(class_exists('SomeModel')){
   //do model exists logic
} else {
   //do other logic
}
// The pitfall of this approach, is that it will not assure 
// that `SomeModel is a decedent of the `Model` class.
person jtrumbull    schedule 23.07.2014

Ты можешь это сделать :

$model = ClassRegistry::init("User");

если $model имеет значение null, это означает, что модель пользователя не существует. Вы можете сделать это из любого места в коде.

person Houcem Berrayana    schedule 29.06.2011
comment
на самом деле это никогда не бывает нулевым! это AppModel, если класс не может быть найден. вам нужно проверить с помощью App::import(), который возвращает логическое значение успеха - person mark; 29.06.2011
comment
неправильно, это новый класс, в любом случае он не соответствует заявленной вами модели - person Antonino Bonumore; 01.01.2012
comment
комментарий Марка правильный. Также см. stackoverflow .com/questions/9382631/ для более подробного ответа. - person Costa; 11.03.2012