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.
Permalink | Yazarı : Fatih BAZMAN | Yorum Ekle | Etiketler : URL yönlendirme yöntem
Türkiye