Salı, 16 Nisan 2013

HMVC Yapısında Kod Tekrarından Kaçınma

 

Genel yaklaşım olarak, MVC yapısında farklı kullanıcı yetkileri ve tipleri tanımlandıkça, Controller kodlarının herbir kullanıcı için yeniden yazılması gerekir.

Model dosyalarının ortak kullanımı sözkonusu olacağı için bunlardaki kodların tekrarlanmasına gerek yoktur. Ancak, Controller kodları için durum farklıdır. Bazı durumlarda birbirine yetki bakımından çok yakın ya da bazı Controller methodlarının aynı olması durumunda, farklı kullanıcı tipleri için aynı kodlar kopyalanıp durur.

Bu tekrardan kaçınmak amacı ile şöyle bir yaklaşım getirilebilir: HMVC kullandığımızı düşünelim. Dashboard isimli modül altında Admin ve Limited isimli iki farklı yetkiye sahip iki kullanıcı olsun. Her iki kullanıcının da ortak kodları aynı isimli bir Controller dosyasında oluşturalım. Application/modules/dashboard/dashboard_controller.php isimli dosyanın içeriği :

<!--?php 
class Dashboard_Controller extends MX_Controller {

 function __construct() {
 
  parent::__construct();
  
  if(! $this--->hmvc_auth->get('logged_in')) redirect(base_url());  
 }
 
 
 function index()
 {
  echo "ERROR! No Pasaran!";
 } 


 protected function main_show_all(){
 
  echo 'Admin ve Limited user ortak oalrak iceride';
 }
 
 protected function main_change_admin(){
 
  echo 'Admin user Change method icin icerdesin';
 }
 
 protected function main_change_limited(){
 
  echo 'Limited user Change method icin icerdesin';
 }
 
}

?>

Yukarıda her kullanıcı için ortak olan kodlar bir araya toplanmıştır. Methodların sadece Admin ve Limited controller dosyalarından bu dosyaya yapılacak istemlerde çalışması için methodlar PROTECTED olmalıdır. HMVC kullanılması nedeniyle, Dashboard_controller< dosyası MX_Controller sınıfını EXTEND etmektedir./p>

Admin kullanıcı için yazılacak modüle ait controller dosyası olan Application/modules/dashboard/admin.php dosyasının içeriği ise:

<!--?php
/*
 Admin user Dashboard Controller
*/

require_once('dashboard_controller.php');

class Admin extends Dashboard_Controller {

 function __construct() {
 
  parent::__construct();

  if(! $this--->hmvc_auth->is_admin()) redirect(base_url());
  
 }
 

 function show(){
  $this->main_show_all();
 }
 
 function change(){
  $this->main_change_admin();
 } 
 
}
?>

Yukarıdaki kodlarda öncelikle dashboard_controller.php dosyası çağırılır. Admin sınıfının Dashboard_Controller sınıfını extend etmesine dikkat edilmelidir. Show isimli method, hem Admin hem de Limited user için aynıdır. Bu nedenle Dashboard_controller dosyasındaki karşılığı olan main_show_all ismi ile çağrılmaktadır.

Ancak, change methodu Admin ve Limited user için farklıdır. Bu nedenle Dashboard_controller dosyasından main_change_admin() isimli method çağrılmalıdır.

<!--?php
/*
 Limited user Dashboard Controller
*/

require_once('dashboard_controller.php');

class Limited extends Dashboard_Controller {

 function __construct() {
 
  parent::__construct();

  if(! $this--->hmvc_auth->is_limited()) redirect(base_url());
  
 }
 

 function show(){
  $this->main_show_all();
 }
 
 function change(){
  $this->main_change_limited();
 } 
 
 
}
?>

Application/modules/dashboard/limited.php dosyasının içeriği ise yukarıdadır. Limited kullanıcısı için show() methodu Admin user ile aynı iken, change() methodu farklıdır. Bu nedenle Dasboard_controller dosyasından Limited user için kullanılmak üzere main_change_limited() isimli methodu çağırmaktadır.

Bu yöntem ile ortak Model dosyası kullanımına benzer olarak, ortak Controller dosyası kullanımı yapılabilir. Sonuçta kodların farklı kullanıcılar için tekrarlanmasının önüne geçilmiş olur.

Bu yöntem kullanılırken dikkat edilecek noktalar:

  • Ortak Controller dosyasındaki methodların PROTECTED olmalıdır.
  • Ortak Controller dosyasında kullanıcının LOGIN olduğu kontrol edilmelidir.
  • Ortak Controller dosyasındaki method isimleri, kullanıcı dosyalarındaki method isimlerinden farklı olmalıdır (show ile main_show_all gibi...).
  • Kullanıcı dosyalarında (admin.php, limited.php) ortak Controller sınıfının REQUIRE_ONCE ile çağrılmaldır.
  • Kullanıcı dosyalarında (admin.php, limited.php) ortak Controller sınıfının EXTEND edilmelidir.

Çarşamba, 10 Ekim 2012

CodeIgniter 2.1.3. Güncellemesi

 

CodeIgniter yeni versiyonu 2.1.3'ü bu hafta yayımladı. 2.x serisinin en son çıkan stabil versionunda, tespit edilen bug'lar düzeltildi. Eğer kullanıcılardan gelen IP adreslerini kullandığınız bir uygulamanız varsa, yeni versiyona yükseltmeniz önerilir.

Yapılan diğer önemli değişiklikler:

  • Session kütüphanesinde, sess_destroy() methodu, userdata dizisini silmiyordu, düzeltildi.
  • Profiler kütüphanesi eğer session kütüphanesi userdata objesi kullanıyorsa E_WARNING hatası veriyordu, düzeltildi.
  • Input kütüphanesi, daha güvenli hale getirildi.
  • CSRF saldırılarını kontrol ve önlemek için ek önlemler alındı.

Önceki versiyonlardan nasıl geçiş yapılacağını öğrenmek için Upgrading linkini takip edebilirsiniz.

CodeIgniter'ın tüm versiyonlarına erişmek için download sayfasını inceleyiniz.

Cuma, 21 Eylül 2012

Komut Satırı Arayüzü

 

CodeIgniter ile hazırladığınız projelerinizi sadece internet tarayıcısı ile değil, komut satırı ekranından da kullanabilme ihtiyacı zaman zaman olabilmektedir.

Örneğin, belirli aralıklarla rapor göndermeniz ya da yedek almanız gerekebilir. Bu gibi durumlarda yazdığınız kodu tetiklemek üzere Linux makinelerde Cron Job, Windows makinelerde ise Task Scheduler üzerine görev tanımlanır.

Tanımlanan görev zamanı geldiğinde tetikleyici kodun çalışması için komut satırından başlatma gerekliliği vardır. İşte bu durumda CodeIgniter 2.0 versiyonundan itibaren standart paket ile dağıtıma sokulan CLI kütüphanesi kullanılır. Komut satırından çalıştırmak için bir deneme yapalım. Applications/controllers dizini altına tools.php isimli bir controller dosyası açalım. İçeriği de şöyle olsun:

class Tools extends CI_Controller {

        public function message($to = 'World')
        {
                echo "Hello {$to}!".PHP_EOL;
        }
}

Normalde bu kodu çalıştırmak için internet tarayıcısı üzerinden şu adres satırını tıklarız:

example.com/index.php/tools/message/to

Aynı kodu çalıştırmak için ise Mac ya da Linux makinelerde Terminal programını, Windows makinelerde ise RUN>cmd yolunu kullanarak şu kodu yazarız:

$ cd /path/to/project;
$ php index.php tools message

Eğer, değişken göndermemiz gerekiyorsa da method isminden sonra parametre girmemiz yeterlidir:

$ php index.php tools message "John Smith"

CodeIgniter 2.0 versiyonlarından önceki versiyonları kullananlar için ise durum biraz daha farklıdır. Bu işlem için CLI kütüphaneleri yazılmış olsa da benim tercih ettiğim en basit yöntem, projenin kök dizinine (index.php dosyasının olduğu yere) bir php dosyası eklemek. Örneğin, adı mycronjob.php dosyamız olsun. İçeriği ise:

$_GET["/tools/message"] = null;
require “index.php”;

Sitenizin config dosyasında "uri_protocol" değerinin AUTO olmasında fayda vardır. Ayrıca bazı durumlarda $_GET["/tools/message"] = null; cümlesi yerine,

$_SERVER["REQUEST_URI"] = "tools/message";

cümlesi kullanılınca çalışması olasıdır. CodeIgniter 2.0 üzeri versiyonlarında CLI kütüphanesinin daha detaylı anlatımı için kullanım kılavuzunu inceleyebilirsiniz.