Ruby ve on Rails frameworkünde çok yeniyim. RoR for Zombies screencastlarını izledim ve sadece birkaç saatlik öğrenme sonucunda aşağıdaki gibi bir controller yazdım.
class WeddingController < ApplicationController
before_filter :get_wedding, :only => [:edit, :update, :destroy]
def get_wedding
/*
Eğer Wedding.find(2) false döndürürse, anasayfaya redirect yap
Eğer Wedding.find(2) veritabanı verilerini döndürürse, dönen veriyi @wedding değişkeni olarak belirtilen methodlara bindle.
*/
end
def edit
//Artık bu method @wedding değişkenine ulaşabiliyor.
end
def update
t = @wedding;
t.wedding_owner = 'Aristona'
t.save()
end
def destroy
@wedding.destroy()
end
end
Yukarıdaki kodun Laravel versiyonu;
class Wedding_Controller extends Base_Controller {
public function edit($id)
{
if(Wedding::find($id) === false)
return Redirect::to('/);
$wedding = Wedding::find($id);
//Edit kodu
}
public function update($id)
{
if(Wedding::find($id) === false)
return Redirect::to('/);
$wedding = Wedding::find($id);
//Update kodu
}
public function destroy($id)
{
if(Wedding::find($id) === false)
return Redirect::to('/);
$wedding = Wedding::find($id);
//Destroy kodu
}
}
Yapmak istediğim;
1.
"if(Wedding::find($id) === false)" kontrollerini DRY'lamak. Yani bu methodlar çalışmadan önce, before kullanarak get_wedding() methodu çalışmalı.
Örneğin;
//controller methodları execute edilmeden önce
'before', function() {
if(self::get_wedding() === null)
return Redirect::to('/');
else continue;
});
// diğer methodlardaki "if(Wedding::find($id) === false)" kontrolleri sllinecek.
2. 1. maddeyi muhtemelen yaparız, ancak eğer get_wedding() bir değer döndürürse (yani veritabanından bir wedding kaydı çekebilirse), bunu fonksiyon içine enjekte edebilirmiyiz?
Örneğin;
//controller methodları execute edilmeden önce
'before', function($UridekiWeddingID) { // wedding/{id}
if(self::get_wedding($UridekiWeddingID) === null)
return Redirect::to('/');
else
Controller::bind('wedding', self::get_wedding($UridekiWeddingID)); //Wedding::find(5);
});
public function get_wedding($id)
{
return Wedding::find($id);
}
public function edit()
{
//Burada Wedding::find($id); kullanmıyoruz! Zaten bindlenmiş olması lazım.
$wedding->delete(); //5. Weddingi veritabanından sildik.
return 'Silindi!';
}
Mantık aslında çok basit. Wedding::find($id) callarını 3 farklı methodda kullanmaktansa ( delete(), edit(), destroy() ), sadece 1 defa yazarak belirttiğimiz methodlara bindlenmesini sağlayacağız.
Bunu Laravel'de nasıl yapabiliriz?