Cuma, 27 Kasım 2009

URL Yönlendirmesinde Farklı Yöntemler

 

Forumda ya da gönderilen özel mesajlarda en çok sorulan konu olan URL yönlendirmesi için neler yapılabildiğini bu yazıda toparlamaya çalışacağım. Kullanma kılavuzunda URI Yönlendirme başlığı altında anlatılan konular, bir çoğumuzun ihtiyacını karşılar niteliktedir. Yine de ana hatlarıyla toparlamak gerekirse CodeIgniter ile site yönlendirmesi 3 ana yol ile yapılır:

  • Htaccess dosyası yardımı ile
  • Application/config/routes.php dosyasında bulunan $router değişkeni ile
  • MY_Router.php dosyasını yazarak, CodeIgniter çekirdek kütüphanesini değiştirmek yolu ile

Htacess dosyası ile yapılan yönlendirmeleri daha önce burada anlatmıştım.

Application/config/routes.php dosyasındaki $router değişkeni ile yapılan yönlendirmeler ise kullanma kılavuzunda etraflıca anlatılmaktadır.

CodeIgniter çekirdek kütüphanesini genişletme yoluyla değişiklik opsiyonu ise daha fazla elastiklik kazandırdığı için dikkatli kullanımlarda daha çok işimize yarayan bir yöntemdir. Kütüphane genişletmek için system/libraries/router.php dosyasını açıp application/libraries dizini altına MY_Router.php dosyası olarak kayıt ediyoruz.

MY_Router.php dosyasında bulunan fonksyionlardan sadece _validate_request fonksiyonu bizlerin işine yarayacak yönlendirmeyi yapan fonksiyondur. Bu nedenle dosyamızda sadece bu fonksiyonun olması yeterlidir.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
/** 
* Router Class 
* 
* Extends CI Router 
* 
* @author     Original by EllisLab - extension by CleverIgniters 
* @see        http://codeigniter.com 
*/ 
class MY_Router extends CI_Router { 
    /** 
     * Constructor 
     * 
     * @access    public 
     */ 
    function MY_Router() 
    { 
        parent::CI_Router(); 
    } 
    // -------------------------------------------------------------------- 
    /** 
     * Validate Routing Request 
     * 
     * @access    public 
     */ 
    function _validate_request($segments) 
    { 
        // Does the requested controller exist in the root folder? 
        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT)) 
        { 
            return $segments; 
        } 
        // Is the controller in a sub-folder? 
        if (is_dir(APPPATH.'controllers/'.$segments[0])) 
        { 
            // Set the directory and remove it from the segment array 
            $this->set_directory($segments[0]); 
            $segments = array_slice($segments, 1); 
            if (count($segments) > 0) 
            { 
                // Does the requested controller exist in the sub-folder? 
                if ( ! 
file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EX T)) 
                { 
                    show_404($this->fetch_directory().$segments[0]); 
                } 
            } 
            else 
            { 
                $this->set_class($this->default_controller); 
                $this->set_method('index'); 
                // Does the default controller exist in the sub-folder? 
                if ( ! 
file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_ controller.EXT)) 
                { 
                    $this->directory = ''; 
                    return array(); 
                } 
            } 
            return $segments; 
        } 
//KENDI ROUTER AYARINIZ BASLIYOR
        if(isset($segments[0]) && ($segments[0] <> 'birinci_controller') && ($segments[0] <> 'ikinci_controller')) 
  { 
   return array('varsayilan_controler', 'varsayilan_methodu',$segments[0]); 
  } 
//KENDI ROUTER AYARINIZ BITIYOR  
        // Can't find the requested controller... 
        show_404($segments[0]); 
    } 
} 

Router.php dosyasında $segment dizisi ile gelen değerler URL`den çekilen segment değerleridir. Bu değerler üzerinde yapılacak yönlendirmeler ile HTTP ile gelen istemleri istediğimiz şekilde yönlendirebiliriz. Yukarıdaki kod üzerinde birinci_controller ve ikinci_controller adı ile yapılan istemler dışında gelen tüm controller istekleri varsayilan_controller ve varsayilan_methodu`na yönlendirilmektedir. URL`nin sonundaki değer ise bu controller metoduna değişken olarak aktarılmaktadır.

Varsayilan_controller.php isimli controller dosyasının içeriği ise genel olarak şöyle olacaktır:

class Varsayilan_controller extends Controller { 
 function uye() 
 { 
  parent::Controller(); 
 } 

 function Varsayilan_methodu($deger) 
 {  
  echo $deger;
 }
}

CodeIgniter üzerinde, PHP`nin yapabildiği herşeyi yapabilirsiniz. Bir çok farklı yöntem içinden uygun olanı seçmek size kalmıştır.

Yorumlar

" Kütüphane genişletmek için system/libraries/router.php dosyasını açıp application/libraries dizini altına MY_Router.php dosyası olarak kayıt ediyoruz."

Burda demek istediğinizi tam anlamadım.  system/libraries/router.php  bu dosyayı kesip application/libraries buraya mı yapıştırıyoruz(Tabi adını My_Route.php yaparak)

@serkan: Mevcut CI kütüphanelerinin nasıl genişletildiği konusu, Kullanım Kılavuzunda detaylı anlatılmıştır.

Soruna gelirsek, kendi yazacağımız kütüphane, CI_Router kütüphanesinin genişletilmişi olacaktır. Bu nedenle, system/libraries dizini altındaki Router.php dosyasını kopyalayıp, gerekli düzenlemeleri yapıyor. System dizini altındaki dosyayı (extend yaptığımız için) silmiyoruz.

Yorum Ekle