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('/', 'HomeController@index');
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'laraapi/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>
Editörde Görüntüle
@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>
Editörde GörüntüleEğ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>
Editörde GörüntüleEğ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