特定のモデルがすでにロードされているかどうかを確認するために使用できるネイティブのcodeigniter関数はありますか?phpclass_exists()
を使用して、モデルがすでにロードされているかどうかを確認できますか?
4 に答える
CI_Loader
コアクラスを拡張したくなるでしょう。(コアクラスの拡張を参照してください)
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');
その戦略はすでにCI_Loader
クラスで使用されています。
このソリューションは、CIのモデル命名機能をサポートします。この機能では、モデルはモデルクラス自体とは異なる名前を持つことができます。このclass_exists
ソリューションはその機能をサポートしていませんが、モデルの名前を変更しない場合は正常に機能するはずです。
注:構成を変更した場合は、変更されてsubclass_prefix
いない可能性がありMY_
ます。
最も簡単な解決策は、PHP関数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
}
最も単純なものが最適です。
編集:
log_message()関数を使用できます。
これをモデルのコンストラクターに入れます(parent :: Model())
log_message ("debug", "model is loaded");
config.phpファイルでログ構成をデバッグモードに設定することを忘れないでください
$config['log_threshold'] = 2;
そして、system / logsディレクトリのアクセス許可を書き込み可能に設定します(デフォルトでは、CIはここにログファイルを作成します)
または、logsディレクトリを別のディレクトリに設定します
$config['log_path'] = 'another/directory/logs/';
その後、CIはディレクトリにログファイルを作成します。必要に応じてログファイルを監視します。デバッグメッセージを取得して、モデルがログファイルにすでにロードされているかどうかを確認できます。
Maxime 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);
}
}
}
?>
このように、モデルがロードされているかどうかを(意識的に)チェックする必要はありません:)