URL Yapısı
KUT Framework ile geliştirilen bir projede istek aşağıdaki gibi örnek bir web adresine yapılır. KUT ile kullanılan URL yapısını anlamak KUT Framework kullanımını anlamak açısından oldukça ön…
This article is currently available in Turkish. Its English translation is being prepared.
KUT Framework ile geliştirilen bir projede istek aşağıdaki gibi örnek bir web adresine yapılır. KUT ile kullanılan URL yapısını anlamak KUT Framework kullanımını anlamak açısından oldukça önemlidir.
| URL | ||||||
| Temel Bölüm | Göreceli Bölüm | Rotalanabilir Bölüm | ||||
| http[s]:// | yourdomain.com/ | [project-name/] | [lang/] | [controller/] | [function/] | [param1/param2 ...] |
Yukarıdaki URL bölümleri aşağıda aşama aşama incelenmiştir.
Bölüm Başlıkları
# HTTP/S
# HTTPS Dönüşümü
# Port Değiştirme
# HTTP'yi Yakalama# HTTP Değeri ile Birlikte Yakalama
# Ön Tanımlı Proje Dizini
# Takma İsim Kullanımı
# Proje Dizinini Yakalama# Dil Değerinin Değişimi
# Aktif Dili Yakalama# Ön Tanımlı Kontrolcü
# Kontrolcü Adını Yakalama
HTTP/S
KUT Framework'te site içi bir URL oluşturmak için URL::site() yöntemi kullanılır. Bu yöntem ile oluşturulan linklerin http:// olan ön eki sitede SSL sertifikasının aktif edilmesi durumunda https:// olarak değişir. Bu dönüşüm otomatik olarak yapılır. Bunun için ekstra bir ayar yapılmasına gerek yoktur. Bu nedenle sitede kullanılan tüm linklerin URL::site() ile yapılması gereklidir. Link bir .css veya .js gibi bir yerel dosyayı gösterecekse URL::site() yerine URL::base() kullanılmalıdır.
echo URL::site('product/list');
Sitenize güvenlik sertifikası kurduğunuzda linkler otomatik olarak http den https'ye dönüşür.
echo URL::site('product/list');
IIS sunucularda HTTPS için 443 dışında başka bir portun kullanılması durumunda linklerin otomatik olarak https ye dönüşebilmesi için aşağıdaki düzenleme yapılmalıdır.
# Kut::run() yönteminden önce
$_SERVER['SERVER_PORT'] = 443;
Şeklinde manipüle edilerek SSL portunun doğru eşleşmesi sağlanmalıdır.
URL'nin bu değerini elde etmek için aşağıdaki yöntemi kullanabilirsiniz.
echo Request::scheme();
Alan Adı / Domain Name
Bu değeri elde etmek için Http::host() yönteminden yararlanabilirsiniz.
echo Http::host();
http://localhost değerini yakalamak için aşağıdaki yöntemden yararlanabilirsiniz.
echo URL::host();
Proje Adı / Project Name
Projects/ dizini içerisinde yer alan proje dizinlerinden çalıştırılacak olanın adını içeren bölümdür. Çalıştırılacak dizin ön tanımlı (Site/) dizin ise yazılmaz. Bunun dışında yer alan dizinleri çalıştırmak için dizin adı yazılır. Şayet Site/ dizini ön tanımlı olduğu için bu dizinin çalıştırılması için doğrudan host adının yazılması yeterlidir.
Ancak farklı bir proje dizinin çalıştırılmak istenmesi durumunda URL'ye belirtilir.
Yukarıdaki istek Projects/Admin/ dizini çalıştırır.
Ön tanımlı olarak çalıştırılan proje dizini Projects/Any/ dizinidir. Ön tanımlı açılış proje dizini değiştirmek için aşağıdaki yapılandırma dosyasından gerekli ayarı yapabilirsiniz.
'default' => 'Frontend'
Proje dizinlerinize erişmek için bu dizin isimlerini temsil edecek takma isimler verebilirsiniz. Bu ayarı düzenlemek için aşağıdaki yapılandırma dosyasını kullanın.
'panel' => 'Backend'
Yukarıdaki düzenlemeden sonra aşağıdaki URL üzerinden Admin/ dizinini çalıştırabilirsiniz.
Bu bölümün ne için kullanıldığıyla ilgili detaylı bilgiye {{Çoklu Proje Geliştirme}} bölümünden ulaşabilirsiniz.
URL üzerinde çalıştırılmakta olan proje dizini adının gerekli olması durumunda CURRENT_PROJECT sabiti ile ilgili proje adı elde edilir.
echo CURRENT_PROJECT;
Dil / Lang
Bu bölüm ön tanımlı olarak kapalıdır. Sitenin seçili dil değerini gösterir. Seçili dil kısaltmasının URL üzerinde görüntülenebilmesi için yapılandırma dosyasından aktif hale getirilmelidir. Bu işlemin yapılması durumunda URL::site() yöntemi ile oluşturulan linkler de bu dil ekini alır. Dile ekinin URL üzerinde görüntülenebilir olması için aşağıda yolu belirtilen yapılandırma dosyasından aktif hale getirilmelidir.
'lang' => true
Yukarıdaki düzenlemeden sonra URL::site() yöntemi aşağıdaki çıktıyı üretir.
echo URL::site('product/list');
Bu değeri değiştirmek için Lang::set() yöntemiden yararlanılır.
Lang::set('tr');
echo URL::site('product/list');
Bu değişiklik aynı zamanda URL üzerinden kullanıcıların bu değeri değiştirip çalıştırması ile de mümkündür.
O an seçili olan dil kısalmasını yakalamak için Lang::get() yöntemiden yararlanılır.
echo Lang::get();
Bu bölüm ile ilgili anlatım {{Dosya Dil Kütüphanesi}} bağlantısında yapılmıştır.
Kontrolcü / Controller
Bu bölüm KUT Framework'te Controllers/ dizininde yer alan kontrolcülerden hangisinin çalıştırılacağını belirler. Hiç bir kontrolcü adı belirtilmeden yapılan isteklerde ön tanımlı olarak çalışan kontrolcü Home kontrolcüsüdür. Bu bölüm ile ilgili anlatım {{İsteklerin Kontrol Edilmesi}} bağlantısında yapılmıştır.
Ön tanımlı kontrolcü bilgisini değiştirmek için aşağıdaki yapılandırma dosyasını kullanabilirsiniz.
'openController' => 'Home'
Kontrolcü adını yakalamak için CURRENT_CONTROLLER sabiti kullanılmalıdır. Farklı yöntemlerle de bu bölüme erişebilir olsa da bu sabit rotalardan etkilenmediği için gerçek kontrolcü adını verir.
echo CURRENT_CONTROLLER;
Yöntem / Function
Bu bölüm bir önceki bölümle ifade edilen kontrolcüye ait fonksiyon bilgisini ifade etmektedir. Hiç bir yöntem adı belirtilmeden yapılan isteklerde ilgili kontrolcünün main yöntemi devreye girer. Yine bu bölümün kullanımı ile ilgili anlatım {{İsteklerin Kontrol Edilmesi}} bağlantısında yapılmıştır.
Ön tanımlı kontrolcü yöntemi bilgisini değiştirmek için aşağıdaki yapılandırma dosyasını kullanabilirsiniz.
'openFunction' => 'main'
Yöntem adını yakalamak için CURRENT_CFUNCTION sabiti kullanılmalıdır. Bu sabit o anda çalıştırılmakta olan gerçek fonksiyon adını verir. Bu sabit rotalardan etkilenmez.
echo CURRENT_CFUNCTION;
Parametreler / Parameters
Çalıştırılan kontrolcünün yöntemine veri göndermek için kullanılan bölümdür. Bu ve bundan sonraki bölümlerin tümü parametre gönderimi için kullanılır.
Parametreleri yakalamak için CURRENT_CPARAMETERS sabiti kullanılabilir. Bu sabit dışında ilgili yöntemin parametrelerine tanımlayacağınız sıralı değişkenlerle de parametreleri yakalayabilirsiniz.
output( CURRENT_CPARAMETERS );
1 => string 'example' ( length = 9 )
2 => string 'value' ( length = 7 )
Dil önekinin tanınması
Adresin ilk parçası dil kodu olabilir. Bu parçanın dil sayılıp sayılmayacağı Services yapılandırmasındaki uri.langRegex deseniyle belirlenir.
'uri' =>
[
// Iki harfli kodlar: /tr/, /en/
'langRegex' => '[a-z]{2}'
// Bolgeli kodlar da kabul edilsin: /tr_TR/, /en_US/
// 'langRegex' => '[a-z]{2}(?:_[A-Z]{2})?'
]
Desen tanımlanmadığında iki harfli kod varsayılır. Bölgeli kod kullanan bir projede desen genişletilmezse adresin ilk parçası dil olarak tanınmaz ve rota çözümlemesi kayar.
Sorgu dizesi rotalanabilir yola dahil değildir
Gelen istekteki sorgu dizesi (?...) rotalanabilir yoldan ayrılır. ? ve sonrası ayrıştırma öncesi kesilir; aksi hâlde son yol parçasını yakalayan bir DB-slug parçası (ör. [products_lang:slug]) sorguyu slug'ın içine katar ve eşleşme başarısız olur — UTM bağlantıları, derin bağlantılar ve ödeme callback adresleri 404 döner.
Sorgu parametreleri yola değil $_GET'e aittir ve Method::get() / Get:: ile okunur. Yol ayrıştırması yalnız rotalamayı etkiler; sorgu parametrelerinin okunmasına dokunmaz.
Rota desenindeki her soru işareti tamamen literaldir, hiçbir zaman düzenli ifade niceleyicisi değildir. Özel karakter kaçışlama geçişi (token dönüşümünden önce çalışır) desendeki her soru işaretini kaçışlı hâle çevirir; bu yüzden ({number})?{link} gibi bir desen id'yi ikiye bölmez — yalnız gelen adreste gerçekten bir sorgu dizesi yoksa hiç eşleşmez (bu {link} token'ının kendi tasarımıdır, bir hata değildir).
{end} artık hem dize sonunu hem sonundaki sorgu dizesini kabul eder. Eskiden yalnız kesin dize sonunu kabul ediyordu ve siparis/{slug}{end} gibi bir desen sonuna ?utm_source=... eklenince 404 veriyordu. Bu, DB-slug aramasının ([table:column]) URI segmentine sorgu dizesi bulaşmasından ayrı bir sorundur: segment değeri yalnız o okuma noktasında (rota eşleştirmesine dokunmadan) sorgu dizesinden ayrıca temizlenir. İkisi birlikte, sorgu dizesi taşıyan bir adresin hem doğru eşleşmesini hem doğru slug değeri üretmesini sağlar.
({end}{or}?tab={word}{end}) biçimindeki alternatifler zaten güvenlidir: yalnız yol olan dal eşleşir, {end}'in yeni sorgu toleransı ekstra sorgu parametrelerini de (?tab=x&y=1) artık reddetmeden kabul eder.
:void dönüş tipi aksiyonu AJAX-yalnız yapar
Bir kontrolcü aksiyonunun dönüş tipi :void olarak bildirildiğinde, çerçeve o aksiyonu bir AJAX/veri aksiyonu sayar ve YALNIZCA AJAX isteklerinde (X-Requested-With: XMLHttpRequest) çalıştırır; echo çıktısı doğrudan istemciye gönderilir. AJAX olmayan (düz tarayıcı/curl/harici yazılım) bir istekte :void aksiyonun yöntemi HİÇ çağrılmaz — istek 200 döner ama gövde boştur (istek sayfa render hattına düşer). Bu durumda die()/exit bile fayda etmez, çünkü yöntem zaten çağrılmamıştır.
Harici bir istemcinin (özel başlık göndermeyen) doğrudan çağıracağı bir uç için aksiyon :void OLMADAN tanımlanmalıdır. Böylece aksiyon bir sayfa metodu gibi hem GET hem POST doğrudan isteklerde çalışır; çıktı die(Json::encode(...)) ile doğrudan gönderilir (sayfa render hattı çıktıyı ezmesin diye). Karşılaştırma: site içi AJAX uçları (_check, _list gibi) :void ile tanımlıdır ve tarayıcının kendi AJAX isteğiyle çalışır; dosya indirme / harici API uçları :void'suz olup die() ile yazar.