Route ile url parametreleri yakalayıp ona göre işlem yapabiliyoruz.
Basit olarak Route ile 3 şekilde veri alabiliyoruz bunlar
- Get (Hiçbirşey yapılmadan normal olarak girildiğinde)
- Post (Başka bir sayfadan post methodu ile girildiğinde)
- Any (İster post ister get ile girildiğinde)
Birer örnek yapalım
Route::get('giris',function(){
// burda giriş formu gösterilir
});
Route::post('giris',function(){
// burda kullanıcı formu doldurup submit ettiğinde giriş işlemleri yapılır
});
Route::any('giris',function(){
// burası her 2 olayıda yakalar
});
evet bu şekilde bir giriş işlemi için Route oluşturabiliriz tabi any'i kullanmamıza gerek yok.Şimdi Route'umuza gelen parametreleri alalım.
Route'da Parametreler
Evet şimdide Route ile gelen parametreyi yakalayıp ona göre işlem yapmayı görücez.
Mesala bir haber scripti yazıyoruz haber okuma sayfası yapıcaz bunun için haber/haber_id şeklinde bir url belirttik yönlendirme yaptık şimdi bunu işleyelim.
Route::get('haber/{id}',function($id){
return $id.' numaralı haber gösteriliyor';
});
şimdi tarayıcımızdan test için laravel/haber/1 yazalım ve sonuç'a bakalım.evet gördüğünüz gibi routemız çalıştı.
Ben burda {id} şeklinde aldım parametreyi ama böyle bir zorunluluk yok oraya istediğimi yazabilirdim aynı şekilde fonksiyondada function($id) şeklinde id değişkenine atadım bununda urldeki parametreyle aynı olmasına gerek yok tamamen farklı değerler girebilirsiniz ben daha sonra bakınca kafam karışmasın diye böyle kullanıyorum.
Bu şekilde Route yapıyorken fonksiyonumuza default bir parametre değeri atayabiliriz yani kullanıcı id girmezse hata vermemesi için örneği default olarak 1 olsun diyebiliriz onuda şu şekilde yapıyoruz;
Route::get('haber/{id?}',function($id=1){
return $id.' numaralı haber gösteriliyor';
});
böyle yapınca laravel/haber/ dersekte bize doğal olarak 1 numaralı haber gösteriliyor diyecek.Şimdi güzelce çalışıyor fakat biz id ye göre veritabanında işlem yapıcaz ileride ama urlmizde sayı değil yazı girsekte çalışıyor
şimdi bunu nasıl çözeceğimize bakalım.
Route'u Regex(Regular Expression) ile filtreleme
Laravel bize Route ile gelen değeri Regex ile işleme imkanı sunuyor şimdi Regex ile gelen parametrenin sadece sayıdan oluşup oluşmadığını kontrol edelim.
Route::get('haber/{id?}',function($id=1){
return $id.' numaralı haber gösteriliyor';
})->where('id','[0-9]+');
bu şekilde sadece sayıdan oluşan parametrelerin gelmesini sağladık burda dikkat etmeniz gereken birşey var {id} ile aldığımız parametre adı where deki ile aynı olmalıdır yani ;
resimdeki seçili 2 alan aynı olmalıdır..
Bu şekilde sadece sayıları aldık peki sadece yazıları(string)'i nasıl alıcaz;
->where('name', '[A-Za-z]+');
bu şekildede sadece yazıları alıyoruz eğer hem yazı hemde sayı olsun istersek
->where('name', '[A-z0-9]+');
şeklinde kullanabiliriz.
Sayılar için bir alternatif kullanım daha vereyim
->where('name', '\d+');
bu şekildede sadece sayı kabul eder.
Route Özel Filtreler
Az önce Regex ile filtreleme yaptık şimdi özel fonksiyonlarla nasıl yapıcaz bunları görelim.
routes.php ile aynı dizinde filters.php de var onu açıp bakarsanız önceden tanımlanmış auth,auth.basic,guest,csrf filtrelerini görürsünüz.Şimdi nasıl kullanacağımıza bakalım;
Route::get('haber/{id?}',array('before' => 'guest',function($id=1){
return $id.' numaralı haber gösteriliyor';
}))->where('id','[0-9]+');
Gördüğünüz gibi burda guest filterini kullandık ve before olarak kullandık yani fonksiyomuz çalışmadan önce o filteri uygulasın dedik.Bu şekilde yaptığımız zaman sadece giriş yapmamış kullanıcılar görecek haberimizi.
Buda before yerine after de kullanabiliriz yani önce belirttiğimiz fonksiyon işlemleri çalışır en son filterimiz çalışır.Şimdi kendimiz bir filter oluşturup bunu kullanalım.Ben bu filteri routes.php de oluşturcam siz isterseniz filters.php de oluşturabilirsiniz öyle olunca karışıklık olmaz böylece.
Route::filter('test',function(){
echo 'test filteri çalıştı';
});
Evet gördüğünüz gibi test adında bir filter oluşturduk şimdi bunu çağıralım routumuzda
Route::get('haber/{id?}',array('before' => 'test|guest',function($id=1){
return $id.' numaralı haber gösteriliyor';
}))->where('id','[0-9]+');
gördüğünüz gibi birden fazla filter kullanmak istersek | ile ayırıyoruz.
Şimdi test etmek için tarayıcımızdan laravel/haber/1 adresine gidip görelim.
gördüğünüz gibi filterimiz çalıştı.
Ayrıca when komutu ile daha pratik bir kullanımıda var şöyle ;
Route::when('profilim','auth');
böylece profilim sayfasına giriş yapmadan girerse otamatik olarak auth filteri engelleyip login kısmına yönlendirir.
Aynı zamanda when ile bir url kökünüde kontrol edebiliriz örneğin;
Admin kısmınız var şu şekilde bölümler oluşturdunuz:
admin/uyeler
admin/haberler
admin/ayarlar
gibi siz bu şekilde tüm admin bölümlerine filter koyabilirsiniz
Route::when('admin/*','admin_kontrol');
Filterlerı aynı zamanda class tanımlayıpda kullanabiliriz mesala üstte admin_kontrol diye bi filter ismi oluşturduk onu bu şekildede tanımlayabiliriz;
class TestFilter{
public function filter(){
echo 'filter çalıştı';
}
}
Route::filter('admin_kontrol', 'TestFilter');
gördüğünüz gibi class tanımlayarakta kullanabiliyoruz filterleri.
Son olarak Route'da grup olayına bakalım.
Route Grupları
Bu kısımda belirli Route olaylarını bir grup içine alıp hepsine birden aynı işlemi uygulayabiliyorsunuz.Yani demin gördüğümüz when komutuna bir alternatif.
Route::group(array('before' => 'admin_kontrol'), function()
{
Route::get('admin/uyeler', function()
{
// admin değilse gelemicek
});
Route::get('admin/haberler', function()
{
// admin değilse gelemicek
});
});
bunuda bu şekilde kullanabilirsiniz.Routes için şimdilik bu kadarını bilmemiz bize yeter bir sonraki makalede görüşmek üzere.





0 yorum:
Yorum Gönder