CodeIgniter: Belirli bir işlevi nereye gitmeli?

4 Cevap php

İşte uygulamanın çoğunda denetleyicileri işlevselliği hızlı bir bakıştır:

  • kontrolör, belirli bir modeli yükler ondan verileri alır, verileri biçimlendirir ve görünümüne biçimlendirilmiş verileri geçirir.

Şimdi tüm veritabanı üzerinde bir arama sorgusu yapması gereken bir arama sayfası, (tüm modeller) vardır. Bu bir liste olarak tek bir sayfada kendi özel biçimlendirilmiş çıktı her veri türünü göstermek gerekiyor.

Sorun:

Arama denetleyici arama yapabilir, dinamik, her kayıt türü için modeli yüklenemedi ve model veri almak. Veri biçimlendirilmiş gerektiğinde sorunu geliyor. Ben sorunlara neden olan arama denetleyicisi, gelen özel denetleyicisi yüklemek çalışıyorum.

Ne yapmalı?

PS: Ben 'Wick' kitaplığı kullanarak çalıştı, ancak kumandanın biçim işlevi olmayan bir nesne üzerinde bir üye çağrı hakkında hataları vererek kendi modeli ve oturum nesnesi kullanmaya çalıştığında başarısız olur.

4 Cevap

Çok üstlenmeden ve deneme / yanılma sonra, yukarıda elde etmek için en iyi yolu, bu yol olduğu açıkça görülmektedir:

  1. Diğer tüm kontrolörler türetildiği baz denetleyicisi biçim işlevi tutun. Biçimi seçenekleri argüman olarak veri nesnesi ile birlikte işleve geçirilir.

  2. Veri biçimlendirme seçeneklerini döndürür türetilmiş her kontrolör, statik bir işlevi yapmak.

  3. Arama denetleyicisi (ana kontrolör türetilmiş kendisi olan) İçinde, her veri nesnesi için, görünüm için nesneyi biçimlendirmek için kullanabilirsiniz sonra, veri biçimlendirme seçeneklerini döndürür kendi özel denetleyicisi statik işlevini çağırın.

Ben sadece veritabanı ile etkileşim için modelini kullanarak sopa, ve her şey kontrolör tarafından yapılacaktır izin söyleyebiliriz sanırım. Herkes hala daha iyi bir çözüm varsa, ben bütün kulaklar duyuyorum.

Kullanmak istediğiniz gibi geliyor Factory design pattern

Bu bir kütüphane yapmak:

class MyModelFactory {
  static public function Factory($data) {
    $type = key($data);
    return new $type($data);
  }
}

şimdi, kontrolör, böyle bir şey yapabilirsiniz:

$model = MyModelFactory::Factory(array($_REQUEST['model'] => $_REQUEST));

ve şimdi $ _REQUEST ['model'] belirtilen ne olursa olsun modeli bir nesne var. Eğer kullanıcı talep ettikleri modeli kullanmak için gerekli izinlere sahip sağlamak için uygulama için ihtiyacınız olabilecek her türlü güvenlik önlemlerini aldığınızdan emin olun

Eğer ortak yöntem ve malzeme kullanılarak olmak istiyorum çünkü Şimdi, sizin modeller muhtemelen .. soyut bir sınıf / arabirimini kapalı dayalı olmalıdır böylece yerine

class MyModelOne extends Model {
  // stuff
}

Muhtemelen gerekli yöntemleri her zaman kullanılabilir olmasını sağlamak için, böyle bir şey istiyorum:

abstract class MyAbstractModel extends Model {

  protected $search_params;

  public function __construct($data = array()) {
     $search_params = $data['search_params'];
  }

  protected function GetSearchParameters() {
    return $this->search_params;
  }
  abstract public function GetData();
  abstract public function GetColumns();
  abstract public function DefineViewOptions();
}

class MyModelOne extends MyAbstractModel {


  public function GetData() {
    $params = array();
    $params[] = $this->db->escape_str($this->GetSearchParameters());
    // return whatever data you want, given the search parameter(s)
  }
  public function GetColumns() {
    // return some columns
  }
  public function DefineViewOptions() {
    // return some configuration options
  }
}

(Eğer böyle bir şey yapmak için izin mods olmasına rağmen) Genel olarak CodeIgniter'daki bir denetleyici içinde başka bir denetleyici yükleyemez.

Ben veri biçimlendirme için bir sınıf oluşturmayı deneyin ve uygulama / kütüphane klasörüne eklersiniz. Sonra çeşitli denetleyicileri boyunca bu sınıf, yüklemek kullanımı ve yeniden kullanabilirsiniz.

Burada ayrıntıları ve kuralları açıklanır CodeIgniter belgelerine Creating Your Own Libraries bir sayfasıdır.

Bir sınıf overkill Ayrıca, eğer yardımcı fonksiyonları oluşturarak daha hafif bir yaklaşımdır.

CodeIgniter'daki kütüphaneler ve yardımcıları arasındaki fark, kütüphaneler sınıflar olduğunu, yardımcıları php fonksiyonları sadece bir grup olmasıdır.

Eğer verileri biçimlendirilmiş sonra, bu yüzden KURU (kendinizi tekrarlamak değil) herhangi bir kumandadan herhangi bir görünümü yükleyebilirsiniz, bu yüzden hala ihtiyacınız olan tüm yeniden kullanılabilirlik olmalıdır

(Mükemmel KURU ne karşı) basittir ne ilkesine dayalı bir kaç basit yaklaşımlar vardır. İşte CodeIgniter ile ben kullanmak alternatif bir yaklaşım:

  1. Bunun yerine birden denetleyicileri yüklemeye çalışırken, arama denetleyicisi görünümü parçaları yeniden (veya rota arama, kullanmakta olduğunuz bağlı olarak). Bu görünümleri değiştirilebilir böylece veri elemanları için aynı adlandırma kuralları kullanarak, ama yine de bunu yapıyor olmalıdır gerektirir.
  2. Bunun yerine arama için birden modelleri kullanarak, aranabilir şeyleri bilen bir tek ara modeli eklemek. Yinelenen SQL önlemek istiyorsanız, modeller arasında SQL (bu sabitleri kullanılarak yapılabilir, veya diskten yükleme SQL) yeniden.

Kontrolörler kendi PHP kod yeniden kullanım için büyük aday değildir: şeyler kendilerini onlar rota eylemler ve kaynaklar için istekleri. Onlar ile geldim URI arabirimini kullanarak, HTTP üzerinden çağrılabilir amaçlanmıştır. Kod çağırarak onları kaçınmak istediğiniz bir eşleme. Yani JavaScript dan (veya cURL ile) denetleyicileri yeniden, dedi herhangi bir web çerçevesinde şeyleri yeniden harika Ayırma, bir yoldur.