Pazar, 19 Haziran 2011

Moduler Genişletme - HMVC

 

CodeIgniter, klasik MVC yapısı altında kullanılabildiği gibi modüler bir yapı ile değiştirilerek de kullanılabilir. Klasik kullanım, application dizini altına controller, model ve view dizinleri ile kullanım imkanı sunmaktadır.

Modüler yapıda ise her controller dosyası, kendi isimlerinde açılan dizinler altına kopylananan MVC dizinlerinden çalışmak mümkündür. Örnek applicaiton yapısı aşağıdaki şekilde görüntülenecektir:

controllers/
models/
modules/
->login/
-->controllers/
-   login.php
-->models/
-   login_model.php
-->views/
-   login_view.php
views/

Bu tarz modüler kullanım bazı açılardan klasik kullanıma göre daha avantajlıdır. Bu avantajları özetlersek:

  • Her modül kendi dosyalarına sahip olacağı için, kodların geri kalanı etkilenmeden sistemin değiştirilmesi mümkündür.
  • Her modül, dizinler altında sadece kendi dosyaları bulunduğundan dosyaların yönetimi daha kolaydır.
  • Modüller arası ortak dosyaların kullanımına izin verilmektedir. Bu nedenle kodların tekrar tekrar yazılmasına gerek yoktur.
  • Url satırı değişmeden yine aynı şekilde controller/method/variable formatı ile programa erişim mümkündür.

Bu amaçla kullanılan moduler ayırma kütüphanelerinden Modular Extensions - HMVC kütüphanesini, CodeIgniter 2.0.2 üzerine kuralım.

  1. Öcelikle CI kurulumunu yaptığınızı ve Welcome sayfasını düzgün gördüğünüzü kabul ediyorum.
  2. Bu adresten HVMC dosyasını indirip bulabileceğiniz bir yere kopyalayınız.
  3. Zıp dosyasını applications dizini altındaki third_party dizini altına kopyalayınız.
  4. Applicaitons dizini altına modules/welcome/controllers dizini oluşturun ve application/controllers dizini altındaki welcome.php dosyasını yeni yerine kopyalayın.
  5. application/modules/welcome/views dizinini oluşturup altına applicaiton/views dizini altındaki welcome_message.php dosyasının yeni yerine kopyalayın.
  6. Tarayıcınızda URL /index.php/welcome yazınca "Welcome to CodeIgniter" gördüğünüzde kurulum tamamlanmıştır.

Modulleriniz içinde kullanacağınız controller örnek iskeleti aşağıdaki gibi olmalıdır.

<?php
class Xyz extends MX_Controller 
{
    function __construct()
    {
        parent::__construct();
        
        $this->load->library('form_validation');
        $this->form_validation->CI =& $this;
    }
}

Yukarıdaki kodlardan da izleyeceğiniz üzere, controller dosyamız CI_Controller yerine MX_Controller dosyasından extend edilmiştir. Parent olarak ise __construct fonksiyonu gösterilmiştir. Controller içinde form_validation kütüphanesi kullanılmak istenirse, callback opsiyonlarının çalışmasını sağlamak üzere kütüphane, $this->form_validation->CI değişkenine atanır.

Daha önce başka dizinlerde yer alan kodlarınızı çağırmak isterseniz ise aşağıdaki yolu kullanmalısınız:

 Modules::run('module/controller/method', $param1, $param2);

Modüler kullanım, kodlarınızı değiştirmek, yeni modüller eklemek istediğinizde sizlere kolaylık sağlaması ve yüzlerce dosya içinde ilgili dosyalarınızı kısa zamanda bulmanızı sağlamak açısından kolaylık sağlayacaktır.

Ekleme - 05.09.2011 Yukarıdaki yazıda anlatılması atlanan konu, Modular Extensions - HMVC paketi içinden çıkan core dizini altındaki dosyaların, CI kurulumunda bulunan applications/core dizini altına kopyalanması gerekliliğidir.

Ekleme - 17.04.2012 CI Versiyon 2.1.0 ile birlikte gerekli bir düzeltme: Form_validation kütüphanesini kullanmak için applicaitons/libraries dizini altına MY_Form_validation.php dosyasını açmalı ve içinde $CI değişkenini public yapmak gereklidir:

<?php
/** application/libraries/MY_Form_validation **/ 
class MY_Form_validation extends CI_Form_validation 
{
    public $CI;
}

Yorumlar

CodeIgniter'a henüz geçmiş birisiyim. Beni en çok düşündüren şey evvelce yaptığım gibi modüler yapıyı nasıl kullanacağım konusuydu. Çok iyi oldu bu bilgi. Teşekkür ediyorum.

Fatih uzun süredir böle bişi arıyordum daha önce HMVC duymuştum ama tam olarak böyle bir yapı olduğunu bilmiyordum haberdar ettiğin sağolasın eline sağlık..

Merhaba Fatih Bey, bi konuda daha yardım siteyelim sizden o vakit ben modules klasöründe admin klasöründe tutmak istiyorum yönetim paneli modullerini ama erişim sağlayamıyorum bu modüllere eskiden index.php/admin yazdığımda direk weolcome çıkardı karşıma veya index.php/admin/login yazdığımda login sayfası çıkardı karşıma ama şimdi bulunamdı diyor nasıl çözebileceğim hakkında bi bilginiz var mı acaba

@Mustafa Yakut: HMVC 5.2.14 versiyonundan itibaren alt dizinleri destekliyor. Örnek olarak burayı inceleyebilirsiniz : http://codeigniter.com/forums/viewthread/115623/#629720 ayrıca şurayı da incelemenizi tavsiye ederim : http://philsturgeon.co.uk/news/2009/07/Create-an-Admin-panel-with-CodeIgniter

peki içiçe klasör kullanımını nasıl gerçekleştirebiliriz ?

ör :

modules/uygulama/ic_uygulama/controllers

seklinde bir kullanım nasıl olabilir ?

Modül içi modül gereksiniminden bahsediyorsanız, kurgunuz yanlış olabilir düzeltmelisiniz. Ancak erişim istediğiniz "module/controller/method" yolu ise zaten bu yol çalışmaktadır.

Merhabalar,
yazıda ikinci kod bloğunda, form_validation library'si yüklenirken, $this-> kısmı $this---> şeklinde yazılmış. Düzeltilmesi iyi olur.

Ayrıca teşekkür ederim bu güzel yazı için ...

Merhaba,

Öncelikle yazı için teşekkurler. Benim sorum urlden index.php uzantısından kurtulmak. HMVC yapısına geçtiğimde .htacess yonlendırmesı bir işe yaramamaktadır.  

@Şaban : Şuradaki yazıyı okudun mu? http://www.codeigniter.gen.tr/post/show/url_yonlendirmesi

Config dosyasında modul yolunu belirtmezseniz ciddi performans kaybına sebep olursunuz. makalede neden bunu belirtmediniz?

$config['modules_locations'] = array(
        APPPATH.'modules/' => '../modules/',
    );

Modül içi modül gereksiniminden bahsediyorsanız


aslına bakarsanız tanımlama biraz yanlıs !
ama " module sub-directory"  özelligi var.

örnek klasor yapısı

modules/
module1/
controllers/
module1.php
module1_istersen_1.php
module1_istersen_2.php
module1_istersen_3.php
sub_directory/
sub_directory.php

views/


daha detaylı bilgi için 

MX_Router.php  dosyasını inceleyin.



bir önceki mesajımda düzeltme:


yanlış =
     MX_Router.php  dosyasını inceleyin.
dogru = 
     application/third_party/MX/Router.php   dosyasını inceleyin.



$config['modules_locations'] = array(
        APPPATH.'modules/' => '../modules/',
    );


bu tanımlamayı yapmassak neden performans kaybı yaşayalım açıklarmısınız ?

MX/Router.php  dosyasını inceledigimde

yukarıdaki tanımlama
application/modules    yolunu değiştimek istediginiz de kullanılır.

örneğin = 
$modules_locations = 'benim_modullerim'; // applications dan itibaren yeni modulespath yolu
$config['modules_locations'] = array( APPPATH.$modules_locations .'/' => '../'.$modules_locations .'/');




Yorum Ekle