2013-02-18 14 views

risposta

12

Sarei tentato di estendere la classe principale CI_Loader. (Vedere 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); 
    } 
} 

Si potrebbe essere il controllo per un determinato modello con il seguente:

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

That strategy è già in uso da parte della classe CI_Loader.

Questa soluzione supporta la funzione di denominazione del modello di CI, in cui i modelli possono avere un nome diverso rispetto alla classe del modello stesso. La soluzione class_exists non supporta questa funzionalità, ma dovrebbe funzionare correttamente se non si rinomina i modelli.

Nota: se è stata modificata la configurazione subclass_prefix, potrebbe non essere più MY_.

4

Modificato:

È possibile utilizzare la funzione log_message().

mettere questo nel costruttore del modello (parent :: Modello())

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

non dimenticate di impostare la configurazione di registro per la modalità di debug nel file config.php

$config['log_threshold'] = 2; 

E impostare il permesso della directory di sistema/logs su scrivibile (per impostazione predefinita CI creerà i file di registro qui)

o impostare la directory dei registri in un'altra directory

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

CI creerà quindi il file di registro nella directory. controlla i file di log come preferisci. È possibile ottenere il messaggio di debug per verificare se il modello è già caricato o meno nei file di registro.

+1

questo mi consentirà solo di sapere se il file esiste, volevo sapere se il primo modello è stato caricato manualmente nel controller o se è stato caricato automaticamente tramite autoload – Xecure

4

riffing fuori quello Maxime Morin & Tomexsans hanno scritto, questa è la mia soluzione:

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

In questo modo, non è mai bisogno di (consapevolmente) di controllare se un modello caricato o non :)

+0

situazione in cui stavo caricando le classi più di una volta e non lanciava alcun errore ma stava usando il limite di memoria PHP e questo risolveva il mio problema senza dover modificare nessun altro codice quindi grazie mille! – Sam

4

La soluzione più semplice è quella di utilizzare la funzione PHP class_exists

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

Ad esempio. se vuoi controllare se Post_model è stato definito o meno.

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

/* 

    a lot of code 

*/ 

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

Il più semplice è il migliore ..

Problemi correlati