Kohana Framework’ünde Routing işlemleri
Hemen hemen her framework’de routing (rotalama veya yönlendirme) işlemleri çok önemlidir. Rota (route) ismi verilen tanımlamalara göre adres satırından gelen URI ayrıştırılır ve böylece Controller, Action ve Parameters gibi bilgiler tespit edilir. Diğer bir değişle rotalar, dışarıdan yapılan isteklerin uygulamamız içerisinde hangi yollardan geçeceğine karar verirler. Kohana‘da bu tanımlamaları yapmak hem çok kolay hem de çok esnektir. Bu yazıda Kohana’daki rotalara yakından bakacağız.
Kohana’da rotalar…
Kohana’da bütün rotalar application klasöründe bulunan bootstrap.php dosyasının en sonunda bulunuyor. Varsayılan olarak 1 tane rota tanımlı geliyor. Rota tanımlamak için Route sınıfının set metodu kullanılıyor. Bu metot 3 tane parametre alıyor (son parametre opsiyonel).
Route::set(rota_ismi, rota, regex);

Rota ismi benzersiz bir isim olmalıdır. Ola ki aynı isme sahip birden fazla rota tanımlanırsa, ilk tanımlanmış olan rota geçerli olacaktır.
Rota içerisinde gördüğünüz "controller", "action" ve "id" kelimeleri ise rota anahtarları (keys) olarak isimlendirilir. Her bir anahtar < ve > sembolleri arasında tanımlanmak zorundadır (html etiketleri gibi). controller ve action anahtarları Kohana için özel anahtarlardır. Çünkü Kohana bu özel anahtarlar sayesinde sizin yazmış olduğunuz Controller sınıfını buluyor ve bu sınıf içerisindeki metodu çalıştırıyor. Bu sebeple, bu özel anahtarları mutlaka Rota içerisine yazmamız gerekir.
Regex bölümünde ise URI eşleştiriliyorken hangi key için nasıl bir regex şablonunun kullanılacağını tanımlanır. Bu bölüme birşey yazmazsanız Kohana, kendi içerisindeki varsayılan regex şablonunu kullanacaktır. Bu bölüme daha sonra daha yakından bakacağız.
Rota anahtarları ve bir rotanın yapısı
Daha önce dediğim gibi rotalar aslında KEY adı verilen anahtarlardan oluşur. <key> şeklinde bir anahtar tanımlamış oluruz. Bu keyler daha sonra URI içerisindeki gerçek değerler ile yer değiştirecektir. Örneğin URI’den welcome/index/10 şeklinde bir bilgi geldiğini varsayalım. Rotamız ise <controller>/<action>/<id> şeklinde tanımlanmış olsun. Bu durumda eşleşme şöyle olacak:

Opsiyonel olmasını istediğimiz anahtarı ( ile ) parantezleri arasına alırız. Böylece URI’den gelmesini beklediğimiz bir değer gelmediğinde de routing işleminin başarılı olmasını sağlarız. Örneğin üstteki örnekte URI içerisinden 10 değeri gelmezse yönlendirme işlemi başarısız olacak, uygulamamız duracaktır. Biz bu 10 değerinin gelmediği zamanlarda da uygulamamızın devam etmesini istiyorsak, Rota tanımlarken "id" anahtarının opsiyonel olduğunu belirtmeliyiz. Bunu şöyle yapabiliriz:
<controller>/<action>(/<id>)
Artık URI’den welcome/index şeklinde bir bilgi gelse bile routing işlemi başarılı olacaktır. Peki ama bu değer gelmediği zamanlarda, bunun yerine varsayılan bir değer kullanabilir miyiz?
Rota anahtarı için varsayılan değer tanımlama
Önceki örnekten devam edelim. Uygulamanız içerisinde URI’den gelen "id" değeri ile işlemler yapıyorsunuz. print $this->param('id') gibi mesela… Fakat bu değer URI’den gelmezse uygulamamız kararsızlaşabilir veya hata üretebilir. İşte bu sebeple "id" parametresi için varsayılan değer atamalıyız. Varsayılan değerleri Route sınıfının defaults metodu ile şöyle yapıyoruz:
Route::set('default', '<controller>/<action>(/<id>)', array())
->defaults(array(
'id' => 10
));
Artık URI’den welcome/index şeklinde veya welcome/index/10 şeklinde bilgi gelse bile routing işlemi başarılı olacak ve uygulamamız çalışmaya devam edecektir.
Anahtar değerleri için regex şablonları tanımlama
Route::set() metodunun en son parametresine, URI’den gelen değerler için özel regex şablonları tanımlayabilirsiniz. Örneğin biz "id" anahtarının değerini 10 olarak bekliyoruz. Fakat ya kullanıcı 10 değil de yazıyla "on" değeri gönderirse? Bu durumda tip uyuşmazlığı sebebiyle yine uygulamamız kararsızlaşacak veya hata verecektir. Şimdi biz Kohana’ya "id" anahtarıyla eşlecek olan değer "yalnızca iki basamaklı sayıdan oluşabilir" diyelim. Bunun için rota tanımlamasını şöyle değiştiriyoruz.
Route::set('default', '<controller>/<action>(/<id>)',
array(
'id' => '[0-9]{2}'
))
->defaults(array(
'controller' => 'welcome',
'action' => 'index',
'id' => 10
));
Artık URI’den gelen ve "id" anahtarı ile eşlecek olan değerin 2 basamaklı bir sayı olduğunu garanti altına almış oluyoruz. Aksi bir durumda routing işlemi başarısız sayılacak ve uygulamamız durdurulacaktır.
Bir başka özel anahtar: directory
Her ne kadar yukarıda yalnızca "controller" ve "action" özel anahtarlarından bahsetsem de aslında "directory" adında son 1 özel anahtar daha var. Yazıyı bitirmeden önce bundan da bahsetmek istiyorum. Biliyorsunuz ki bütün yazdığımız Controller sınıfları Kohana’nın application/classes/controller klasörü altında yer alıyor. Ama bazen bu klasör altında "alt klasörler" de açmamız gerekiyor.

Örneğin bir sitenin yönetim paneli için yazacağımız Controller sınıflarını "admin" isimli bir alt klasörde toplamak isteyebiliriz. Bu alt klasördeki Controller sınıflarına adres satırından erişmek için rota içerisinde directory isimli özel anahtarı kullanmamız gerekiyor. Diyelim ki URI’den gelen bilgi admin/member/edit/45 şeklinde olsun. Bu durumda rotamızın yapısı şu hale gelecktir.

Bu yapıyı dikkate alarak rota içerisinde "directory" anahtarını eklememiz gerekecek:
Route::set('subfolder', '<directory>/<controller>/<action>/<id>');
Artık URI’den admin/member/edit/45 şeklinde bir bilgi geldiğinde Kohana "admin" klasörüne girecek, buradaki "Controller_Admin_Member" sınıfından bir örnek oluşturup bu sınıfın "action_edit()" metodunu çalıştıracaktır. Bu metoda da parametre olarak "45" değeri yerleştirecektir. Bu işlemi konuşma diline dökecek olursak Kohana’ya "45 nolu üyenin bilgilerini Admin olarak düzenlemek istiyorum" demiş oluyoruz.
Son sözler…
bootstrap.php dosyasının sonuna bu yazıda bahsettiğim gibi kendi uygulamanıza özel rotalar tanımlayabilirsiniz. Dikkat etmeniz gereken nokta, bütün rotaları Kohana ile birlikte gelen "default" ismindeki rotadan önce tanımlamanız. Çünkü Kohana sizin rotalarınızdan birisini kullandığı zaman ve "başarılı" olarak işaretlediği zaman geri kalanları kontrol etmeyecektir. Eğer tanımladığınız hiçbir rota başarılı olmazsa, en son "default" isimli rota denenecektir.
Ben bu yazıda rotaların daha çok yapısını anlatmaya çalıştım. Yazıda pek örnek olmaması veya daha derin bilgiler olmaması bu yüzdendir. Eğer siz daha fazlasını istiyorsanız Kohana dökümantasyonundaki Routing açıklamalarına http://kohanaframework.org/3.0/guide/kohana/routing adresinden ulaşabilirsiniz.
Faydalı olması dileğiyle
















Rotaları test etme ile ilgili birkaç kod, bootstrap.php dosyasında route kodlarından sonrasına yapıştırarak kullanılabilir.
$uri değişkeninine test edilmek istenen uri yazılır, örneğin http://localhost/kategori/papatya şeklindeki adresimiz için kategori/papatya yazılır.
Eşleşmeyen rotalar yerine FALSE, eşleşen rotalarda ise path, controller, action ve içeriklerinden oluşan bir dizi yazar.
Kodlar şu adreste:
http://kerkness.ca/wiki/doku.php?id=routing:how_to_test_the_routes
döküman için teşekkürler eburhan, frameworkler dikkakitimi gerçekten çok çekmekte ama şöyle birşey söz konusu şuan kendimi OOP öğrenme üzerine yoğunlaştırdım. PHP klasik fonksiyonlar ile istediğim siteyi rahatlıkla kodlayabiliyorum ama OOP öğrenmek şart oldu. Ayrıca frameworklerin tembellik oluşturacağı düşüncesine kapılıyorum. sizin fikrinizide almak isterim frameworkleri etkin kullanabilmek için OOP öğrenmek şart mı?
Güzel bir framework. CodeIgniter mı ve Kohana karşılaştırması yapmam lazım…
Sevgili @Bora , oop framework kullanmak istiyorsan , elbette oop etkin şekilde öğrenmek zorundasın.
yazmaktan , ancak şimdi gördümde gülüyorum sadece , ne gereksiz yahuu demekten başka bir şey demiyorum.
Şu frameworklerin tembellik , oluştur (rurmu-mazmı) sorusu inanki yıllardan beri formlarda tartışılan konular arasında ancak , 3 -4 yıl evvel bir forumda bu mevzuya katılmıştım ve şiddetli çatışma çıkmıştı , öyleki klavyem ağladı
1. yargı fw kullanmak tembelleştirir
(evet) Çünkü kendini dosyaları copy paste yapıp adlarını set ettiğini düşünürsün buda , ben tembelmiyim acaba fikrini oluşturur
(hayir) Ben akıllıyım aynı kodu bi daha yazmıyorum , sistematiğim ben abiy diyebilirsin.
2.oop bilmek şart oldu.
(evet) Artık her yer şey değişti , metrobus bile beylikdüzüne giderken , benım halen fonksiyonel çalışmam ayıptır. Önce Class ! Önce populer yazılım !
(hayir) fonksiyonlar neyime yetmiyor. hem classlarda fonksiyonlardan olusuyor. Ekstra özelliklerinide kullanmıyorum. simdiye kadar çok baba siteler fonksiyonel yazıldı. Önemli olan , hız performans ve sonuc.
En önemliside , o maaşa ben kalkıp oop yazmam
genel olarak benım , o konuşmalardan hatırladığım muhabbetler bunlardadı sanırım .
Bence ; Oop ogrenmek güzel , artı katar , ancak şart değil .
Framework kullanmak , başlarda iyi gelsede , sonradan yok diyorum diyorum , nerde ne var , için rahat etmez
bu arada router konusu onemli gercekten , gerek oop olsun gerek olmasın . sağlam bi roter olması lazım.
Yoksa rfi den yersiniz.
Saygılar.