Rota Yöntemleri
"Basit bir konsol komutu ile projenin orijinal haline dokunmadan restorasyon çalışması yapabilirsiniz."
Rotalar gerçek controller/method bilgisini değiştirmeksizin URI üzerinde manipülasyon yapmanıza olanak sağlayan yapılar olarak karşımıza çıkmaktadır. ZN Framework'te URI controller/method bilgisi içerdiğinden daha anlamlı ve kullanıcıların görmek istediği şekilde yeniden düzenlenebilir.
Rota düzenlemeleri 2 yerden yapılabilir;
# Rota Yapılandırması
Rota yapılandırma dosyasında yer alan changeUri dizisi üzerinde de rota işlemleri tanımlayabilirsiniz.
'changeUri' =>
[
'^urun-listesi' => 'Urunler/list',
]
Yukarıdaki dizide yer alan dizi anahtarı yeni rota bilgisidir. Değer ise yeni rota bilgisinin aslında neyi çalıştıracağı bilgisidir. Anahtar değerler düzenli ifade biçiminde yazılmalıdır ve ifadenin başına sonuna / gibi düzenli ifade ayracı eklemenize gerek yoktur.
Yukarıda yer alan rota yapılandırması dışında Routes/ dizini kullanarak bu kullanımına göre daha işlevsel rota işlemleri gerçekleştirebilirsiniz.
# Yöntemler
Route::uri(string $path = NULL) : void |
Route::change(string $route) : this |
Route::usable(bool $usable = true) : this |
Route::csrf(string $type = 'post') : this |
Route::method(string ...$methods) : this |
Route::restore(mixed $ips, string $uri = NULL) : this |
Route::ajax() : this |
Route::redirect(string $redirect) : this |
Route::show404(string $controller) : void |
Route::direct() : this |
Route::container(callable $callback) : void |
Route::callback(callable $callback) : this |
# URI
Rotanın hangi controller/method'a yapılacağıdır. Rotalama işlemini tamamlamak için kullanılan nihai yöntemdir.
Parametreler
string $path | Rotanın hangi kontrolcü ve yönteme yapılacağı belirtilir. |
Kullanımı
Route::change('product-add')->uri('product/add');
Route::change('about-me')->uri('Home/about');
Yukarıda dikkat edilirse 1. parametreye sadece kontrolcü ve fonksiyon bilgisi yazılmıştır.
Eğer yazılacak parametre fonksiyon bilgisi içermezse main kabul edilir.
Route::change('urunler')->uri('product');
Yukarıdaki örnek rota, adres çubuğundan localhost/urunler adresine istek yapıldığında product/main kontrolcüsünü çalıştırır.
Bazı durumlarda doğrudan doğruya bir kontrolcü/fonksiyon bilgisi yazmak yerine temsili ifadeler kullanılabilir. Yani kontrolcünün veya fonksiyonun herhangi bir ifade olma durumu da söz konusu olabilir. Bu gibi kullanımlarda düzenli ifadelerde yer alan $x deyiminden yararlanılır.
Route::change('({word})-({word})')->uri('$1/$2');
Yukarıda URL'ye controller-method bilgisi yazıldığında controller/method'a yönlendirme yapan bir kullanım gösterilmiştir. change() yöntemi içerisine yazacağınız özel ifadeleri $x deyimi sayesinde uri() yöntemi içinde istediğiniz yere yerleştirebilirsiniz.
# Change
Hedef kontrolcü ve fonksiyonun yerini alacak yeni yol bilgisini oluşturmak için kullanılır.
Parametreler
string $route = NULL | Yeni rota. |
return this |
Kullanımı
Route::change('product-add')->uri('product/add');
Yukarıdaki örneğe göre artık URL üzerinden /product-add ile ilgili kontrolcüye gidebilirsiniz.
URL üzerinden gönderilecek verinin türünü belirleyebilirsiniz. Bu belirtilen tür dışında veri gönderilirse rota başarısız olur. Bu dayatmalar için kullanılabilen anahtarlar aşağıda anlatılmıştır.
Route::change('product-add/id/:numeric')->uri('product/add');
Yukarıdaki örnekte ifade ve tür dayatması oluşturduk. Yeni rotamız id ve sayısal bir değer içermek zorunda.
Bu anahtarlar URL üzerinden belli türde verilerin gönderilebilmesi için tasarlanmıştır.
:numeric | Sadece sayısal veri. |
:alpha | Sadece alfabetik veriler. |
:alnum | Hem sayılar hemde alfabetik veriler. |
:seo | Seo'ya uygun veriler. Örnek: bu-seo-icin-uygun-bir-ifade |
:all | Tüm veriler. |
Rotada düzenli ifade kullanmak için aşağıdaki bağlantıda verilen özel çevrimler listesinde yer alan karakter kümelerini kullanabilirsiniz.
Düzenli ifadeler özel çevrimler listesi için tıklayınız.
Route::change('products/{word}')->uri('products/type');
Yukarıdaki rotada URL'ye products/herhangi_bir_kelime yazıldığında products/type kontrolcüsüne yönlenmesi sağlanmış olacaktır.
Yukarıdaki örneği bir bir eşleşen şekilde de kullanabilirsiniz.
Route::change('{starting}products/{word}{ending}')->uri('products/type');
Yukarıda verilen özel ifadeleri genişletebilir kendinize göre özel kullanımlar oluşturabilirsiniz. Bunun için;
Yukarıdaki yapılandırma dosyasında yer alan regex dizisine istediğiniz deseni ekleyebilirsiniz.
'regex' =>
[
'{phone}' => '[0-9]{10}'
]
Yukarıdaki tanımlamadan sonra rotada kullanabilirsiniz.
Route::change('profile-({phone})')->uri('user/profile');
Bu yöntem URI'dan gelen verinin veritabanından kontrolünü sağlarayak rotaya yerleştirilmesini sağlar. Yani veritabanından gelen değere göre yönlendirme yapabilirsiniz.
Kullanımı daha iyi anlaşılması için örnek verilmiştir.
Route::change('[blog:slug]')->uri('blog');
Yukarıdaki kullanım URI 1. bölümden gelen değeri blog tablosunun slug kolonundan kontrol eder sonuç bulunursa blog/main yöntemini çalıştırır.
Route::change('profile/[account:name]')->uri('account/profile');
Yukarıdaki kullanım URI 2. bölümden gelen değeri account tablosunun name kolonundan kontrol eder sonuç bulunursa account/profile yöntemini çalıştırır.
Tek Boyutlu Veri Çözümlemesi
Veritabanında kayıtlı olan veri JSON, Serial veya Separator türünde tek boyutlu veri ise bu eşleşme için verinin çözümlenmesi gerekir. Genellikle çoklu dile bağlı çözümlemeler için kullanılır.
decoderName | json, serial veya separator sınıf isimlerinden herhangi birini temsil eder. |
key | Bu bölüm kullanılmaz ise aktif dil kısaltmasını kullanır en, tr gibi. Encode edilmiş veri dizisinden hangisinin çağrılacağını belirten dizi anahtarıdır. |
Kullanılabilir Örnek Data
+----+----------------------------------+------+
| ID | SLUG | BLOG |
+----+----------------------------------+------+
| 1 | {"en":"what-is-zn","tr":"zn-nedir"} |
| 2 | {"en":"installation","tr":"kurulum"} |
+----+-----------------------------------------+
Varsayılan Değer
Varsayılan değer sistemin ön tanımlı dilidir. Örnek: tr, en
Route::change('[blog:slug, json]')->uri('blog');
Otomatik Dil Değişimi
Eğer çekilen veri dil kısaltmalarından oluşan çok dil verisi ise URL üzerinden girilen verinin ait olduğu kısaltmaya göre seçili dil otomatik olarak değişir. Yukarıdaki tabloya göre
URL: /what-is-zn => Seçili dil EN
URL: /zn-nedir => Seçili dil TR
Değer Belirtme
Çözümlenen verilerden hangisinin çağrılacağı.
Route::change('[blog:slug, json:en]')->uri('blog');
Değeri dinamik olarak belirtebilirsiniz.
Route::change('[blog:slug, json:' . Lang::get() . ']')->uri('blog');
URL üzerinde yer alan kontrolcü, yöntem ve parametrelerin bir birileri arasında yer değiştirmesini sağlayabilirsiniz. Bunun için yazılacak özel desen parantezler(ifade) içine alınır ve bu parantezli ifadeleri $x kullanımları temsil eder. Bu zaten düzenli ifadelerde de kullanılan bir özelliktir.
Aşağıdaki örnekte account kontrolcüsü ile yöntemleri arasında id olacak şekilde URL'mizi düzenlemek istiyoruz.
Route::change('account/({id})/({word})')->uri('account/$2');
Yukarıda uri içinde yer alan $2 URI'de 3. bölüme yani ({word}) yerine yazılacak değeri temsil eder.
$x Kuralı
Bu kural düzenli ifadelerin kendi kullanımıdır. Bu deyimden düzenli ifadelerde belli tanımlamalara göre yakalanan değerleri değiştirilecek ifade de kullanmak için yararlanılır. Burada x sayıyı ifade eder. Düzenli ifadelerde kaç tane (ifade) ifadesi kullanılırsa x o kadar değer alır.
Route::change('account/({id})/({word})')->uri('account/$2');
Yukarıdaki örnek rotada sırayla ({id}) $1 ile ({word}) $2 ile ifade edilir.
# Usable
Rota işleminden sonra orijinal kontrolcü/yöntem üzerinden girişi engelleyebilirsiniz.
Parametreler
bool $usable = true |
Orijinal kontrolcü/yöntem üzerinden erişim sağlansın mı? False ayarlanması durumunda erişim engellenir. |
return this |
Kullanımı
Route::change('product-add')->usable(false)->uri('product/add');
Yukarıdaki ifade ile artık product/add üzerinden sayfaya erişim sağlanamayacaktır.
# CSRF
Belirtilen rotada csrf ataklarına karşı token kontrolü yapmak için kullanılır. Bu kontrolü yaptığınız rotadaki Form kullanımınızda mutlaka Form::csrf() kullanımına yer verilmelidir. Eğer normal HTML Form kullanıyorsanız CSRFInput() yöntemi kullanılır.
Parametreler
string $type = 'post' | post - get | Form gönderim türü. |
return this |
Kullanımı
Route::csrf()->method('post')->uri('product/add');
Form sınıfının csrf() yöntemidir.
@Form::csrf()->action('product/add')->open('formName')
.
.
.
@Form::close()
Form sınıfı kullanmıyorsanız aynı işleve karşılık gelen fonksiyondur.
@Form::action('product/add')->open()
@CSRFInput()
.
.
.
@Form::close()
# Method
İstek yapılan sayfanın hangi veri türlerini kabul edeceğini belirlemek için kullanılır. Genellikle sayfalara GET ve POST isteği yapılır.
Parametreler
string ...$methods | Hangi metot veya metotların kabul edileceği. |
return this |
Kullanımı
Route::method('post', 'get')->uri('product/add');
İsteğin URL üzerinden yapılıyor olması gereklidir. Farklı türde gelen istekleri engeller.
Route::method('get')->uri('product/add');
İsteğin bir form nesnesinin post metodu ile yapılıyor olması gereklidir. Farklı türde gelen istekleri engeller.
Route::method('post')->uri('product/add');
Birden fazla türde isteğin kabul edilebilmesi için kabul edilecek istek türlerini method() yöntemi içine sırayla belirtmeniz yeterlidir.
Route::method('post', 'get', 'put', 'delete')->uri('product/add');
# Restore
İstek yapılan sayfada çalışma yapılacağı zaman kullanılabilir. Özellikle canlı ortamda bir sayfada karşılaşılan hatanın giderilmesi için o sayfada çalışma başlattığınızda o sayfaya o an için istek yapan kullanıcıların olası kod hataları veya deneme sonuçları ile karşılaşmaması için bu yöntemi kullanabilirsiniz. Burada yapmanız gereken çalışma yapılacak sayfaya erişim için IP adresi/adresleri tanımlamanızdır. Bu tanımlama diğer kullanıcıların o sayfaya erişimini engelleyecektir.
Parametreler
mixed ...$ips | Hangi IP adreslerinin giriş yapabileceği. |
string $redirect = NULL | Belirtilen IP dışında kalanların hangi sayfaya yönlendirileceği. |
return this |
Kullanımı
Route::restore('127.0.0.1', 'Home/restore')->uri('product/add');
Aynı anda birden fazla IP'ye izin vermek için 1. parametrenin dizi olarak kullanılması gerekir.
Route::restore(['127.0.0.1', '127.0.0.2'], 'Home/restore')->uri('product/add');
# Ajax
Ajax işlemlerini gerçekleştirdiğiniz sayfaya URL üzerinden erişimi engeller. Yani sayfanın sadece AJAX için kullanılabilmesini sağlar. Bu durum ajax sayfalarınızın URL üzerinden manipüle edilmesini engeller.
Parametreler
return this |
Kullanımı
Route::ajax()->redirect('Home/invalidRequest')->uri('product/ajaxAddItem');
# Redirect
Geçersiz rota isteği yapılması durumunda yönlendirmenin nereye yapılacağını ayarlayabilirsiniz.
Parametreler
string $redirect | Hangi kontrolcü/yöntem'e yönlendirme yapılacağını ayarlamak için kullanılır. |
return this |
Kullanımı
Route::ajax()->redirect('Home/invalidRequest')->uri('product/ajaxAddItem');
Yukarıda yer alan product/ajaxAddItem adresine ajax dışında iştek yapılması durumudna Home/invalidRequest adresine yönlendirme yapılacaktır.
# Show404
Yapılandırma dosyası üzerinden yapılabilen bu ayar artık Routes/ üzerinden de yapılabilecektir. Geçersiz URL isteklerini yönlendirmek için kullanılır.
Parametreler
string $controller | Hangi kontrolcünün hangi metodunun 404 olarak açılacağı belirtilir. |
return void |
Opsiyonel Yöntemler
direct() : this |
Kullanımı
Route::change('404')->show404('Home/s404');
Yukarıdaki kullanımda geçersiz bir istek sonrasında Home/s404 kontrolcüsüne yönlendirmiş olduk. Home/s404'e de rota verdiğimiz için yönlenen sayfa /404 sayfası olacaktır.
Bu yöntemle istenirse yönlendirme yapılmadan kontrolcü ve fonksiyon çalıştırılabilir.
Route::direct()->show404('Home/s404');
Yukarıdaki kullanımla geçersiz sayfaya istek gönderildiğinde doğrudan Home::s404() yönteminin çalıştırılması sağlanacaktır.
# Container
Ortak kural kullanımına olanak sağlamak için geliştirilmiştir. Birden fazla rota benzer kurallara içerecekse bu yöntemden yararlanılır.
Parametreler
callable $callback | Çalıştırılacak rotalar. |
return this |
Kullanımı
Route::method('post')->csrf()->container(function()
{
Route::uri('product/add');
Route::change('product-list')->uri('product/list');
});
Route::method('get')->container(function()
{
Route::uri('contact');
Route::uri('contact/form');
});
Bu güncelleme ile özyineleme özelliği eklenmiştir. Artık Route::container() yöntemi içe içe kullanılabiliyor. Daha önceki sürümlerde iç içe kullanım özelliği yoktu.
Route::redirect('404')->container(function()
{
Route::method('get')->container(function()
{
Route::ajax()->container(function()
{
Route::uri('product/edit');
});
});
Route::method('post')->container(function()
{
Route::csrf()->container(function()
{
Route::uri('product/add');
Route::uri('store/add');
});
});
});
# Callback
Rota içerisinde komut çalıştırmak için kullanılır.
Parametreler
callable $callback | Çalıştırılacak işlev. |
return this |
Kullanımı
Route::change('user-{word}')->callback(function()
{
Post::send('Example Data');
})->uri('user/profile');