2013-02-18 4 views
6

Есть ли встроенные функции codeigniter, которые я могу использовать, чтобы определить, была ли уже загружена определенная модель? Можно ли использовать php's class_exists(), чтобы определить, была ли уже загружена модель?Codeigniter: как я могу узнать, загружена ли модель?

+1

Да, вы можете и он будет работать – tomexsans

ответ

12

У меня возникло бы желание расширить основной класс CI_Loader. (См extending Core Class)

class MY_Loader extends CI_Loader { 

    function __construct() 
    { 
     parent::__construct(); 
    } 

    /** 
    * Returns true if the model with the given name is loaded; false otherwise. 
    * 
    * @param string name for the model 
    * @return bool 
    */ 
    public function is_model_loaded($name) 
    { 
     return in_array($name, $this->_ci_models, TRUE); 
    } 
} 

Вы бы проверить для данной модели со следующими требованиями:

$this->load->is_model_loaded('foobar'); 

That strategy уже используется CI_Loader класса.

Это решение поддерживает функцию именования модели CI, где модели могут иметь другое имя, чем сам класс модели. Решение class_exists не поддерживает эту функцию, но должно работать нормально, если вы не переименовываете модели.

Примечание: Если вы изменили конфигурацию subclass_prefix, это может быть не MY_.

4

Отредактировано:

Вы можете использовать функцию log_message().

Поместите это в конструктор вашей модели (родительский :: Model())

log_message ("debug", "model is loaded"); 

не забудьте установить конфигурации журнала в режиме отладки в файле config.php

$config['log_threshold'] = 2; 

И установите права на каталоги системы/журналов на запись (по умолчанию CI создаст здесь файлы журналов)

или установить каталог журналов в другом каталоге

$config['log_path'] = 'another/directory/logs/'; 

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

+1

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

4

риффов от того, что Максим Morin & Tomexsans написал, что это мое решение:

<?php 
class MY_Loader extends CI_Loader { 
    /** 
    * Model Loader 
    * 
    * Overwrites the default behaviour 
    * 
    * @param string the name of the class 
    * @param string name for the model 
    * @param bool database connection 
    * @return void 
    */ 
    function model ($model, $name = '', $db_conn = FALSE) { 
     if (is_array($model) || !class_exists($model)) { 
      parent::model($model, $name, $db_conn); 
     } 
    } 
} 
?> 

Таким образом, вы никогда не должны (сознательно) проверить, является ли модель загружается или нет :)

+0

Я столкнулся с проблемой ситуация, когда я загружала классы более одного раза, и она не бросала какие-либо ошибки, но она использовала предел памяти PHP, и это исправило мою проблему без необходимости изменять какой-либо другой код, поэтому большое спасибо! – Sam

4

Самым простым решением является использование РНР-функции class_exists

http://php.net/manual/en/function.class-exists.php

Например. если вы хотите проверить, был ли Post_model определен или нет.

$this->load->model('post_model'); 

/* 

    a lot of code 

*/ 

if (class_exists("Post_model")) { 
    // yes 
} 
else { 
    // no 
} 

Самый простой из лучших ..

Смежные вопросы