Как проверить, существует ли модель с CakePHP? - PullRequest
4 голосов
/ 21 февраля 2012

Я динамически загружаю модели в функции общего назначения, и я заметил, что иногда я хочу пропустить загрузку моделей, потому что это вызывает ошибку 404.

Как я могу проверить, существует ли модель?

Что-то вроде:

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

Ответы [ 5 ]

8 голосов
/ 22 февраля 2012

Поскольку вы не указали свою версию, я разделил мой ответ на два: один для 1.3 и один для 2.0.

CakePHP 1,3

Метод loadModel() вернет false, если не может найти модель, см. Документацию API . Так что просто проверьте, что он не возвращает false как:

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

CakePHP 2.0

Если класс модели не существует, метод loadModel() выдаст MissingModelException, так что просто поймайте это.

См. API документы по этому вопросу.

Пример: * * тысяча двадцать-пять

try {
    $this->loadModel($type);
} catch(MissingModelException $e) {
    // Model not found!
    echo $e->getMessage();
}
4 голосов
/ 06 марта 2013

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 голос
/ 22 июля 2013

Я сделал небольшую настройку функции Адама, чтобы учесть и плагины:

  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;
  }

Использование:

ее можно назвать так:

$ this-> modelExists('SomeModel');

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

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

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

// Обратите внимание, используйте array () вместо [], если вы планируете развертывать на php версии <5.4 </p>

0 голосов
/ 16 августа 2015

это работает для меня как для торта 2

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

на App::objects('Model') возвращает все имена моделей в виде массива

0 голосов
/ 21 февраля 2012

для 1.3 вы можете использовать

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

, который возвращает false, если его не существует

Для 2.x я еще не нашел работающего решения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...