Giriş yap

Laravel Route Yapısı

En basit tanımıyla routing işlemini yol göstermek gibi düşünebilirsiniz. Örneğin /uyeler bölümüne giriyorsa, o zaman şu fonksiyonu çalıştır ya da şu controller dosyasını çağır dediğiniz bir yapı düşünün. İşte buna routing yapısı deniyor. Yani sistemin olmazsa olmaz yapısı diyebiliriz. Laravel'de en basit routing, tip url ve fonksiyondan oluşuyor. Ana sayfaya girdiğimizde Merhaba Dünya yazdırabileceğimiz bir route örneğine bakalım.

Route::get('/', function(){
    return 'Merhaba dünya!';
})

Closure fonksiyon yerine bir controller ve metoduda çağırabilirdik. Şöyle ki;

Route::get('/', '[email protected]');

Ana sayfaya girdiğimizde app/Http/Controllers/HomeController.php dosyasını çağıracak ve sınıf içindeki index() metodunu çalıştıracak. Tabi controller dosyasının sizin tarafınızdan oluşturulması gerekiyor. En kolay şekilde terminal'de php artisan make:controller controller_adi komutuyla oluşturup içerisinde index() metodunu tanımlayarak kullanabilirsiniz.

Route tanımlarımızı ana dizinde bulunan routes dizininin altında ki dosyalarda yapıyoruz. Kısaca bu dosyalar neler ve ne işe yarıyor bir bakalım.

  • routes/web.php --> arayüz route'ları burada tanımlanır. Böylece CSRF koruması, oturum yönetimi gibi özellikleri rahatça kullanabilirsiniz. Projenizde en sık kullanacağınız route tanım yeri bu dosya olacak.
  • routes/api.php --> api ile ilgili route tanımlarınız burada olacak. Burada tanımlanan route'lara api/route-adi şeklinde erişilir. Yani sizin API sayfanız için gidip üstteki route dosyasında tanımlamanıza gerek yok. Adamlar sizi düşünüp vermişler bunun için bir dosya :)
  • routes/console.php --> php artisan komut_adi şeklinde kullandığımız özel komut işlemleri için burayı kullanacağız.
  • routes/channels.php --> WebSocket ile ilgili routing işlemleri içinde bu dosyayı kullanacağız.

Kullanılabilir Route Metodları

Yukarıdaki örnekte sadece get metodunu gördük. Laravel route işlemlerinde aşağıdaki şekilde metodlar kullanılabilir.

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Eğer aynı route'da birden fazla metodun geçerli olmasını istiyorsanız şu şekilde kullanabilirsiniz;

Route::match(['get', 'post'], '/', function () {
    // kodlarınız
});

Eğer metod farketmeksizin çalıştırmak istersenizde any() metodunu kullanabilirsiniz.

Route::any('/', function () {
    // kodlarınız
});

CSRF Koruması

HTML tarafından route'lara veri göndermek istediğinizde, form'un içerisinde mutlaka @csrf direktifini kullanmanız gerekiyor. Aksi taktirde istek reddedilecek ve sayfa açılmayacaktır. Şu şekilde kullanmanız gerekiyor;

<form method="POST" action="/profil">
    @csrf
    ...
</form>

@csrf direktifi, form içinde gizli bir input oluşturacak ve mevcut token'ı göndermenizi sağlayacaktır.

Route Yönlendirme

Eğer tanımladığınız route, başka bir adrese yönlendirilmek için kullanılıyorsa redirect() metodu kullanılır.

Route::redirect('/buradan', '/buraya-yonlendir');

Varsayılan olarak, Route::redirect 302 durum kodunu döndürüyor. Bunu kendiniz ayarlamak isterseniz 3. parametreyi kullanabilirsiniz.

Route::redirect('/buradan', '/buraya-yonlendir', 301);

Kalıcı yönlendirmeler için 301 durum kodu kullanıldığını biliyorsunuzdur. Her seferinde 3. parametreyi tanımlamak istemezseniz buna özel olan Redirect::permanentRedirect metodunu kullanabilirsiniz.

Route::permanentRedirect('/buradan', 'buraya-yonlendir')

View Route

Eğer tanımlayacağınız route sadece view dosyası çağıracaksa buna özel olan Route::view metodunu kullanabilirsiniz. Örneğin ana sayfa için index view'ını çağıran bir route tanımlayalım.

Route::view('/', 'index');

Ayrıca parametre göndermek isterseniz, 3. parametreye dizi tanımlayabilirsiniz.

Route::view('/', 'index', ['title' => 'Anasayfa']);

Route Parametreleri

Zorunlu Parametreler

Bazen url'deki değerleri almanız gerekir. Örneğin /uye/15 değerindeki 15 bizim için değişken bir değerdir ve bunu route tanımımızda alıp işlem yapmamız gerekir. Bunuda route tanımlarken yapmamız gerekiyor. Şöyle ki;

Route::get('uye/{id}', function ($id) {
    return 'Üye ID '.$id;
});

Adres çubuğunuza site.com/uye/1 yazdığınızda Üye ID 1 şeklinde sonuç alırsınız.

Burada parametre tanımları {} içinde yazılmalı ve ingilizce harf ya da sayılardan ve alt çizgiden oluşmalı. Ayrıca parametre adımız id diye, fonksiyon içinde parametre alırken aynı isimle almak zorunda değiliz. Fakat anlamlı olacağı için genelde aynı isimleri kullanıyoruz.

Opsiyonel Parametreler

Bazen parametre varsa alıp işlem yapmak, yoksa da çalışmaya devam edecek bir route tanımlamak isteyebiliriz. Bu durumda parametre adının sonuna soru işareti koymamız yeterli olacaktır.

Route::get('uye/{ad?}', function ($ad = null) {
    return $name;
});

// alternatif olarak değer yoksa varsayılan bir değer tanımlayabiliriz
Route::get('ad/{ad?}', function ($ad = 'Tayfun') {
    return $ad;
});

Burada unutmamanız gereken, bu şekilde kullanıyorsanız Closure içerisinde mutlaka değişkeni bir değere eşitlemeniz gerekiyor. Aksi taktirde hata alırsınız.

Parametrelerde Düzenli İfadeler

Tanımladığımız parametrelerin bazen bazı koşullara uymasını isteyebiliriz. Örneğin ID değeri alacağımız bir parametre sadeece sayıları kabul etsin, kullanıcı adı değeri alacağımız parametre a-z ve sayıları kabul etsin gibi. Bu durumda parametrelere regex deseni tanımlayabiliyoruz. Şöyle ki;

Route::get('uye/{id}', function ($id) {
    // sadece sayısal bir değer girilmişse burası çalışır
})->where('id', '[0-9]+');

Route::get('uye/{ad}', function ($ad) {
    // sadece a-z ve sayılardan oluşursa burası çalışır
})->where('ad', '[A-Za-z0-9]+');

Route::get('uye/{id}/{ad}', function ($id, $ad) {
    // her iki parametrenin koşulları yerine geldiyse burası çalışır
})->where(['id' => '[0-9]+', 'ad' => '[A-Za-z0-9]+');
Global Parametreler

Yukarıdaki gibi her seferinde tek tek tanımlamak istemezseniz, bu tanımları global olarak yapmanız mümkün. Bunun için app/Providers/RouteServiceProvider.php dosyasını açın ve boot() metoduna aşağıdaki gibi tanımlarınız yapın.

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9+]');
    Route::pattern('string', '[a-zA-Z]+');

    parent::boot();
}

Tanımlarınızı yaptıktan sonra artık isimleriyle birlikte route işlemlerinizde kullanabilirsiniz. Otomatik olarak bu koşullara göre kontrol edecektir.

Route::get('uye/{id}/{string}', function ($id, $ad) {
    // her iki parametrenin koşulları yerine geldiyse burası çalışır
});
Encoded Parametre

Genelde arama işlemlerinde aranan kelime encode edilmiş bir şekilde url'de gözükür. Bunu route'da tanımlamak için her gelen değeri kabul edecek bir düzenli ifade yazmamız gerekiyor. Tek bir şey hariç o da slash (/) işareti. Şöyle ki;

Route::get('ara/{kelime}', function ($kelime) {
    return 'Aradığınız kelime = ' . $kelime;
})->where('kelime', '.*');

Bu tarz işlemler için bir tık RegEx bilginiz olması gerekiyor.

Adlandırılmış Route

Adlandırılmış route'lar, daha sonra rotaya uygun URL oluşturamanız için kullanabileceğiniz bir yöntem. name() metodu ile route'unuzu adlandırabilirsiniz.

Route::get('uye/profil', function () {
    //
})->name('profil');
Adlandırılmış Route'un URL'ini oluşturmak

Adlandırdığınız route'lar için URL oluşturmak istediğinizde şu şekilde kullanabilirsiniz;

$url = route('profil'); // http://site.com/uye/profil linkini döndürür
    
// Ayrıca buna göre yönlendirme de yapabilirsiniz
return redirect()->route('profil');

Aynı şekilde laravel'in template engine'i blade'de yani view'larınızda şu şekilde kullanabilirsiniz;

<a href="{{ route('profil') }}">Proil</a>

Eğer adlandırdığınız route parametre içeriyorsa, örneğin aşağıdaki gibi;

Route::get('uye/{id}/profil', function($id){
    //
})->name('profil');

O zaman URL oluştururken şöyle yapmanız gerekir;

$url = route('profil', ['id' => 1]);

Blade tarafında ise şu şekilde tanımlarsınız;

<a href="{{ route('profil', ['id' => 1]) }}">Proil</a>

Eğer parametreler haricinde diziye başka değerler eklerseniz, otomatik olarak query string olarak eklenir. Yani URL'in sonuna key=value şeklinde. Örneğin;

Route::get('uye/{id}/profil', function($id){
    //
})->name('profil');

$url = route('profil', ['id' => 1, 'tab' => 'fotograf']);
// Çıktı: http://site.com/uye/1/profil?tab=fotograf
Günlük Film Tavsiyesi