Esistono funzioni di codificatore nativo che posso utilizzare per determinare se un determinato modello è già stato caricato? Si può usare php class_exists()
per sapere se un modello è già stato caricato?Codeigniter: come posso sapere se un modello è già stato caricato?
risposta
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_
.
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.
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
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 :)
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
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 ..
Sì, è possibile e funzionerà – tomexsans