Codeigniter Serisi 4 – Routing

PHP Programlama  Mart 1, 2015

Routing konusunda eğer PHP taraflı bir yazılım geliştiricisi iseniz oldukça zor anlar yaşadığınızı ve routingin bazen çalışmadığını düşündüğünüz dahi olmuştur. Ancak CI routing konusunda sizi rahatlatacak çözümler üretiyor. Çünkü routing konusu bildiğinizden çok farklı.

Standart CI routing yapısını söyleyecek olursam, http://www.url.com/Controller/Function/ID mantığıyla çalışıyor. Yalnız Controller belirtmeden Function ve Controller ile Function’u belirtmeden ID çağıramıyorsunuz.

ControllerFactory adını ASP.Net MVC kullanmışsanız belki duymuşsunuzdur. Aynı husus CI için de geçerlidir. Olayı anlatmak gerekirse sistem şu şekilde çalışmakta. Siz bir istekte bulunuyorsunuz ve CI buna karşılık bir Controller ile bu Controller içerisinde bir fonksiyon çağırıyor. Eğer site ana dizinini çağırdıysanız CI routing sistemi bu aşamada config.php de tanımlanan default controller değerini okuyarak Controller Factory’den bu kontrollerin bir instance’ını üretmesini istiyor. Controller Factory (bu arada kontroler fabrikası oluyor Türkçesi) ilgili Controller sınıfına ait instance oluşturuyor. Routing sistemi bu işlemden sonra ilgili fonksiyonu çağırıyor. Tabi bu da default olacağı için index fonksiyonu oluyor. Ancak biz www.site.com/kurumsal/vizyon adresini çağırırsak durum ilk olarak şu şekilde işliyor. Routing Controller Factory’den kurumsal Controllerini üretmesini ve vizyon fonksiyonunu çalıştırmasını söylüyor. Oldukça mantıklı, ilk seçenek Controller ikinci seçenek ise Function’a karşılık geliyor. Peki bu aslında Contents Controllerinde ki 12 nolu kaydı ekrana dök demek olsaydı?

controllerfactory

Yukarıda ki şemada görüldüğü gibi Request başlangıcı ile Routing işlemi yapılıyor ve Controller Factoryden istenilen Controller üretiliyor. Bunun sonucunda da üretilen sonuç Response ile Cliente geri döndürülüyor. Şimdi Routing sembolüne bakacak olursanız bir kararsal mekanizma sembolünde. Çünkü bir karar mekanizması. Eğer biz yukarıda ki soru için aşağıda ki kodu config klasörümüzde ki routes.php dosyasına yazarsak istediğimiz gibi bir contenti sanki bir dosyaymış gibi gösterebiliriz.

$route['kurumsal/vizyon'] = 'contents/index/12';

Bu şu demek oluyor, eğer kurumsal/vizyon adresine biri yönleniyor ise standart factory çağrısı yapmak yerine eşitliğin diğer kısmında ki çağrıyı yani contents Controllerini oluştur ve index fonksiyonuna 12 değerini parametre göndererek çağır. Klasik rewrite_mod yapsından oldukça basit ve işlemi CI tarafında yürütmek mümkün oluyor.

Hemen standart bir kaç örneği size göstererek ilerlemek istiyorum. Örnekler CI’nin dokümantasyonundan alınmıştır.

$route['journals'] = "blogs";

Bu journals çağrısını blogs controllerine yönlendirir.

$route['blog/joe'] = "blogs/users/34";

Bu blog/joe çağrısını blog controlleri users fonksiyonuna 34 id sini parametre olarak gönderecek şekilde bağlanmıştır.

$route['product/(:any)'] = "catalog/product_lookup";

Bu product/ ile başlayıpda devamında ne olduğu önemli olmayan bir çağrıyı catalog controllerinin product_lookup fonksiyonuna bağlar.

$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";

Bu product/ ile başlayıp ardından bir numara (yani sayısal olması şart) olan çağrıyı catalog controllerinin product_lookup_by_id fonksiyonuna bağlar. Ancak $1 :num ile gelen ilk segmentteki değeri referans eder. Böylece product söyleminden sonra fonksiyon belirtmeden bir id ile ürün getirtmeniz mümkün.

$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";

Burada products altında harflarden oluşan bir segment ile daha sonra da numara (digit) olan yapıyı, $1 yani ilk parametrik segmenti controller id_$2 de ikinci segmentteki sayısal parametreyi id_ ile başlayan bir fonksiyona yönlendirir. Örneğin products/tshirt/12 şeklinde ki bir çağrı bu durumda tshirt controllerini oluşturacak ve id_12 adında bir fonskiyonu çağıracaktır. Bu örnek pek işe yarar değil gibi görünüyor ancak Regular expression ile sizde parametrik olarak expressionlarınızı route edebilirsiniz.

Dikkat etmeniz gereken bir hususdan bahsediyor CI, bu gireceğiniz expression ve diğer route değerleri hem reserve edilmiş adresleri içermemeli hem de bunların altında olmalı. Yani ilk başta gelen routes.php deki değerleri başka bir amaç için kullanamazsınız ve bunların altından routesleri yazmanız gerekmekte.

Bir sonraki yazımda Controller işlemlerine başlayacağız. O zamana kadar esenlikle…

Bu yazı 2779 defa görüntülendi

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Yazar Hakkında

15 yıllık çalışma hayatında birçok proje geliştirmiş binlerce projeyi inceleme fırsatı bulmuş yazılım aşığıdır. İşini hobi olarak gören yazarımız iş hayatını profesyonelce zevkle sürdürmektedir.

Son Eklenenler