Bu CodeIgniter modeli içinde başka bir model erişemedi olmak için kullanılır.
$this->load->model('bar');
$this->bar->something();
Bu hala geçerli mi, yoksa onlar değişti?
Ben güçlü bir "model" sadece basit CRUD operasyonları ile bir veritabanı tablosu saklanması gerektiğini kavramı ile katılmıyorum. Wikipedia makalesinde belirttiği gibi:
http://en.wikipedia.org/wiki/Model-view-controller#As_a_design_pattern
... Bu uygulama katmanı sadece bir tek veritabanı tablo soyutlama olarak hareket daha yapmak amaçlanmaktadır. Kelime "kontrolör" anlamını düşünün - oldukça kendi içinde ve tüm uygulama olmaktan çok bir yönetmen olarak daha hareket etmelidir. Iş mantığı için bir "model" is bir yer. Aslında en büyük ölçekli uygulamalar (tetikleyiciler, depolanmış prosedürler, yabancı anahtarlar, vb şeklinde) veritabanının kendisi onların iş mantığı çok tutun.
Bence onunla kavramların kendilerini çok anlayış taşıyan olmadan bir "model" kısmen "MVC" aynı (aşırı) yutturmaca neden olduğu şeyin yanlış anlama. Tür boş "AJAX", "Web 2.0", ya da daha kolay nasıl gibi. Iyi ya da kötü, script çocukları bol MVC vagon üzerine atladı ve basit NASIL ve örnek senaryolar beri gibi "modeli", bu tabaka kötüye içinde veritabanı kodu koymak size çok daha yapmayın sadece bir veritabanı soyutlama olağan hale gelmiştir. Şimdi bir modelde herhangi bir iş mantığı koymak "hackish", "kirli", "unpure" olarak nitelendirdiği internet üzerinden tüm mesajlarını okumak. Bu yanlış. Yanlış bilgilendirilmiş.
Basit bir örnek, yabancı tuşları düşünmek: Eğer sadece "model" a database model olmak istiyorsanız bile, sen, "saf", "doğru" ya da ne var, gerçekten olmak istiyorsanız orada tutarlılığını zorlanarak edilmelidir. Yıllardır MySQL gerçek yabancı anahtar desteği olmaması sayesinde, web uygulamaları herkes hiç başvuru bütünlüğü endişesi olmadan büyüdü. Sanırım script kiddie yaşam tarzına uyar. Her neyse, yabancı anahtar geçerliliğini muhafaza edebilmek için bir model bile bu basitleştirilmiş görünüm için, bir model, daha sonra diğerleri ile çalışmak zorundadır (veya, CodeIgniter gibi bir çerçeve bunu izin vermez, özellikle eğer diğer sorguları yazmak zorunda tablolar, başka bir yerde bazen çoğaltarak sorguları - kötü tarzı).
Bu nedenle, bu CodeIgniter bir eksiklik olduğuna inanıyorum. Ben kolay bir düzeltme olmayabilir anlıyorum, ama kesinlikle bir hayal kırıklığı gözetim bulunuyor.
Peki ne yaptım ben şimdi, normal $ this-> load-> modeli () işlevi hemen hemen aynı çalışan bir işlevi var ki, bir yardımcı haline yukarıda ve soyut örnek kod almak oldu. Burada (auto-yüklü ve herhangi bir model kullanabilirsiniz bir yardımcı koymak) 'dir:
/**
*
* Allow models to use other models
*
* This is a substitute for the inability to load models
* inside of other models in CodeIgniter. Call it like
* this:
*
* $salaries = model_load_model('salary');
* ...
* $salary = $salaries->get_salary($employee_id);
*
* @param string $model_name The name of the model that is to be loaded
*
* @return object The requested model object
*
*/
function model_load_model($model_name)
{
$CI =& get_instance();
$CI->load->model($model_name);
return $CI->$model_name;
}
Bu ideal ve ideal veya saf uygulaması daha "hızlı düzeltme" için kötü ve daha kabul mümkün değil ama.
class Location extends Model{
public function get($ID){
// Get main CI object handle and load model
$CI =& get_instance();
$CI->load->model('LocationType');
// Call new model functions using handle to main CI object
$CI->LocationType->setID($result->LocationTypeID);
$CI->LocationType->setTitle($result->TypeTitle);
$this->_locationType = $CI->LocationType;
//Other Stuff
}
}
Herzaman bu gibi ana CI nesnesini kullanarak konum muhtemelen kötü bir fikirdir. Yeniden düşünüyorum düzen çalışın ve sadece veri geçmek / denetleyicinizle gelen modelleri.
In situations like this in Code Igniter I prefer one of two posiibilities:
1) Have model's attribute and setter like this:
class X extends Model {
var $Y_model;
public function setY($Y) {
$this->Y_model = $Y;
}
public function doItRightNow($a,$b) {
$list = $this->Y_model->getSomeList($a,$b);
// ...
}
// ...
}
And then use this setter before other methods to give an instance of other model so it can be used by methods.
$this->load->model('X');
$this->load->model('Y');
$this->X->setY($this->Y);
$this->X->doItRightNow($something,$somethingElse);
2) To have a parameter in method by which I will give an other model instance from controller.
class X extends Model {
public function doItRightNow($a,$b,$Y_model) {
$list = $Y_model->getSomeList($a,$b);
// ...
}
// ...
}
Ve bu gibi kullanmak:
$this->load->model('X');
$this->load->model('Y');
$this->X->doItRightNow($something,$somethingElse,$this->Y);
I think that these are more clean possibilities.
Which way to use depends on how many methods need to access other model. If there are one or two it might be better to give it as a method parameter. If more - I think it's better to have a class attribute and setter.
And in elegant way you can give one model or another depending on some condition - if they both partially implement same interface with the same kind of data returned (it's rarely useful, but it can be sometimes).
Ben genellikle daha iyi bir ihtiyaç olması halinde modellere erişebilmesi ve sonra model kütüphaneleri dahil yazma kütüphaneler olduğunu düşünüyorum.
Eğer birisi belli bir CRUD eylem ile geçmesi için yetkili olup olmadığını kontrol etmek gerekirse Örneğin, sen (onun muhtemelen çoğu durumda otomatik dahil) kullandığınız her türlü doğrulama kütüphanesi eklemek isteyebilirsiniz. Sen mutlaka doğrudan modeli erişmek istemem - sadece kirli ve yanlış görünüyor.
Ben tercih edilen yolu sizin denetleyicisi yapmak ve bir modelin yöntem (ler) den sonuçlarını geçmek için gerekenleri yapmak olduğunu düşünüyorum, ihtiyaç olması halinde, diğer modelin yöntemine (ler).
Başka içine bir model, başına dahil etmek mümkün olmaz neden olursa olsun, ben göremiyorum. Ama, size gösteriyor sözdizimi ile bunu yapabileceğimi sanmıyorum. Sen bunu başka kıvrık bir şekilde yapmak gerekir. Her durumda, IMO, başka bir model doğrudan bir model eklemek kötü bir uygulamadır.