Rota Yöntemleri


    × Bunları biliyor muydunuz?
"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.

Yapılandırma

Rota düzenlemeleri 2 yerden yapılabilir;

Dosya: Config/Routing.php
Dosya: Routes/*.php

 

 

# Rota Yapılandırması


Rota yapılandırma dosyasında yer alan changeUri dizisi üzerinde de rota işlemleri tanımlayabilirsiniz.

Dosya: Config/Routing.php
'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ı

Dosya: Projects/Any/Routes/Routes.php
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.

Main Varsayımı

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.

Temsili İfadeler ve Değer Yerleştirme

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ı

Dosya: Routes/Routes.php
Route::change('product-add')->uri('product/add');

Yukarıdaki örneğe göre artık URL üzerinden /product-add ile ilgili kontrolcüye gidebilirsiniz.

Uyarı: Bu yöntemin parametresi bir düzenli ifade deyimi içerdiğinden dolayı bu parametre kesin eşleşme yerine içinde geçen şeklinde eşleşme sağlar. Kesin eşleşme için "Düzenli İfadelerin Kullanımı" başlığına gidin.
İfade ve Tür Dayatması

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.

Kullanılabilir Anahtarlar

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. 
Düzenli İfadelerin Kullanımı

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');

Düzenli İfadeleri Genişletme

Yukarıda verilen özel ifadeleri genişletebilir kendinize göre özel kullanımlar oluşturabilirsiniz. Bunun için;

Yapılandırma: Settings/Expressions.php -> regex

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');
Veritabanı Rotalama

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: [tableName:columnName]

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.

Kullanım: [tableName:columnName, decoderName:key]
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'); 
Bölümlerin Yer Değiştirmesi

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ı

Dosya: Projects/Any/Routes/Routes.php
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ı

Dosya: Routes/Routes.php
Route::csrf()->method('post')->uri('product/add');
Form Nesnesi

Form sınıfının csrf() yöntemidir.

File: Project/Any/Views/product.wizard.php
@Form::csrf()->action('product/add')->open('formName')
    .
    .
    .
@Form::close()
CSRFInput Nesnesi

Form sınıfı kullanmıyorsanız aynı işleve karşılık gelen fonksiyondur.

File: Project/Any/Views/product.wizard.php
@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ı

Dosya: Routes/Routes.php
Route::method('post', 'get')->uri('product/add');
GET Kabulü

İsteğin URL üzerinden yapılıyor olması gereklidir. Farklı türde gelen istekleri engeller.

Route::method('get')->uri('product/add');
POST Kabulü

İ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');
Çoklu Kabul

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ı

Dosya: Routes/Routes.php
Route::restore('127.0.0.1', 'Home/restore')->uri('product/add');
Çoklu IP Tanımlaması

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ı

Dosya: Routes/Routes.php
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ı

Dosya: Routes/Routes.php
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ı

Dosya: Routes/Routes.php
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.

Bilgi: Bu yöntemde Route::change() ile parametre belirtilmezse ön tanımlı değer 404 kabul edilir.
# Direct [6.1.0]

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ı

Dosya: Routes/Routes.php
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');
});
Özyineleme [6.1.0]

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ı

Dosya: Routes/Routes.php
Route::change('user-{word}')->callback(function()
{
    Post::send('Example Data');

})->uri('user/profile');