2013-02-18 23 views

Odpowiedz

12

Chciałbym pokusić się o rozszerzenie podstawowej klasy CI_Loader. (Patrz 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); 
    } 
} 

Byłbyś sprawdzenie danego modelu z następujących czynności:

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

That strategy jest już używany przez klasę CI_Loader.

To rozwiązanie obsługuje funkcję modelowania nazw CI, gdzie modele mogą mieć inną nazwę niż sama klasa modelu. Rozwiązanie class_exists nie obsługuje tej funkcji, ale powinno działać poprawnie, jeśli nie zmieniasz nazwy modeli.

Uwaga: Jeśli zmieniłeś konfigurację subclass_prefix, może ona już nie być MY_.

4

Zmieniano:

Można użyć funkcji log_message().

umieścić to w konstruktorze Twojego modelu (rodzic :: model())

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

Nie zapomnij ustawić config dziennika do trybie debugowania w pliku config.php

$config['log_threshold'] = 2; 

I ustaw uprawnienia do katalogu system/logs na writable (domyślnie CI utworzy pliki dziennika tutaj)

lub ustaw katalog dzienników w innym katalogu

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

CI utworzy plik dziennika w katalogu. monitoruj pliki dziennika w dowolny sposób. Możesz pobrać komunikat debugowania, aby sprawdzić, czy twój model jest już załadowany, czy nie, w plikach dziennika.

+1

to tylko poinformuje mnie, czy plik istnieje, chciałem się dowiedzieć, czy pierwszy model został załadowany pojedynczo do kontrolera lub czy został automatycznie załadowany przez automatyczne ładowanie – Xecure

4

riffy off co Maxime Morin & Tomexsans zostały napisane, to jest moje rozwiązanie:

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

ten sposób, że nie zawsze trzeba (świadomie) sprawdzić, czy model jest naładowany czy nie :)

+0

natknąłem się na sytuacja, w której ładowałem klasy więcej niż jeden raz i nie wyrzucałem żadnych błędów, ale korzystałem z limitu pamięci PHP i to naprawiło mój problem bez potrzeby modyfikacji żadnego innego kodu, więc dziękuję bardzo! – Sam

4

Najprostszym rozwiązaniem jest użycie php class_exists

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

Na przykład. jeśli chcesz sprawdzić, czy Post_model został zdefiniowany, czy nie.

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

/* 

    a lot of code 

*/ 

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

Najprostszym jest najlepszy ..

Powiązane problemy