sametatabasch yazdı
CMS tarzı bir proje yapıyorum. Site adı, site açıklaması, il ilçe listesi gibi bir çok veriyi bu tabloda tutuyorum. Tablo yapısı şu şekilde:
Schema::create('options',function($table){
$table->increments('id'); // buna gerek yok ! eğer model kullanmayacaksanız.
$table->text('optionKey');
$table->text('optionValue');
$table->text('optionType');
$table->timestamps();
});
@MURATSPLAT bunun için Eloquent model kullanmam doğru değil mi ?
Yazılımda tek bir doğru yoktur. Bu nedenle doğru demek yerine "hangi yol projem için en ideal yoldur?" diye sormak lazım.
Key Value biçiminde tablo içerisinde ugulamanızın ayalarını kullanacaksanız, model yerine Laravel veritabanı objesi ile doğrudan erişin. Çok basit bir yapı gerektiği için Eloquent'ı ayağa kaldırmaya gerek yok.
interface IAppOptions {
/**
* To get key in collection
*
* @param string
* @return \Illuminate\Support\Collection;
*/
public function all();
/**
* To get key
*
* @param string
* @return mixes
*/
public function get($key);
/**
* To set key
*
* @param string
* @param mixes
* @return void
* @throws
*/
public function set($key, $value);
/**
* To determine given key
*
* @param string
* @return boolean
*/
public function has($key);
/**
* to delete given key
*
* @param string
* @return bool
*/
public function delete($key);
}
Yukarındaki arayüzü kullanan bir AppOptionRepository sınıfı yaratabilirsiniz..
Bu sınıf için örnek bir kurucu. Özellikle veritabanına nasıl erişilir sorusu açısından bu örneği veriyorum.
/**
* Create a new file Repository instance.
*
* @param \Illuminate\Database\DatabaseManager $db
* @param \Illuminate\Cache\Repository $cache
* @param \Illuminate\Config\Repository $config
*/
public function __construct(DatabaseManager $db, Cache $cache, Config $config) {
$this->connection = $db->connection();
$this->builder = $this->connection->table($this->getTableName());
$this->cache = $cache;
$this->config = $config;
$this->rememberTime = $this->config->get('app.cachedDuration');
}
Yukarıdaki kurucuya benzer bir kurucu ile repossitory içinden veritabanına ve caching sürücüsüne erişebilirsiniz. Laravel Container Resolver sınıfın bağımlılıklarını çözecektir. Yukarındaki örnekte laravelin config nesnesine erişiliyor. Caching zamanı gibi parametreleri uygulama ayarlarından çekmek için kullanışlı bir yoldur.
Şimdi bu aşamada uygulamanın ayarlara erişirken her defasında veritananına bakması yerine önbellekteki tabloya bakar. Zaman aşımı ya da bir event yazılarak sonrasında ayarlar tablosunda bir değişiklik olduğunda önbellekdeki tablo, silinebilir.
/**
* to get all keys in the table
*
* @return \Illuminate\Database\Eloquent\Collection
*/
public function all() {
list($key, $time) = $this->getCachingParameters();
$results = $this->cache->remember($key, $time, function() {
return $this->builder->get();
});
return new Collection($results);
}
Ayarlarımızın olduğu tabloya erişmek için her defasında veritabanına istek göndermek yerine eğer tablo önbelleğe atılmışsa oradaki satırlar üzerinden okuma yaparız. Bu saye de her uygulama isteği olunca 2-3 queryden tasaruff yaparız..
Örnek bir has methodu.
öyle bir tablomuz olsun..
Schema::create('options',function($table){
$table->string('key', 100)->unique(); // önbellekleme yapılacağından indexlemeye gerek yok.
$table->string('value', 1000); // belki serilaize kullanarak diziler de kayıt etmek isteriz
$table->tinyInteger('type')->unsigned();
});
arayüzde bahsi gecen has methodunu repository içinde yazarsak şuna benzer bir şey olur.
/**
* To find given key
*
* @param string $key
* @return bool
*/
protected function has($key) {
// Collection sınıfındaki filter methodu ile aradığımız keyi buluyoruz.
// Eğer filtreye hiçbir şey takılmadıysa yani boşsa aradığım key yoktur.
return ! $this->all()->filter(function($item) use($key) {
if ($item->key === $key) {
return true;
}
})->isEmpty();
Daha önceki all metodunda tablomuzdaki tüm satırları ön belleğe atmıştık. Sonrasında laravel ile gelen Collection sınıfının nimetlerinden yararlanmak içi önbelleğe atılan satırları collection objesi oluşturduk.
Örneklerini verdiğim mantıkla basit tablolara eloquent(model) kullanmakdan erişebilirsiniz. Son zamanlarda basit tablolar için eloqeunt kullanmanın hem kaynak hem de kullanım açısından hantal ve diğer taraftan esnek olmadığını fark etim. Bir de bu yapı test edilebilir bir yapı. key value kullanımını modellerde kullansanız static methodlar yazmak zorundasınız. Static yapılar test edilemiyor.
Bir de caching yapacaksınız zaten modelleri yardımcı bir sınıf içinde cachemek(repository içerinde) öneriliyor.
Laravel içinde basit tablolarla çalışırken Repository classlar kullanıyor.
En meşhuru:
https://github.com/laravel/framework/blob/5.0/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php