LARAVEL'İN GİZLİ CEVHERLERİ

MUSTAFA AKÇAKAYA

Laravel kullanan bir çok geliştirici, bendeniz de dahil, büyük ihtimal frameworkün bize sunduklarının sadece yüzeyde gözükenlerini kullanıyordur. Dokümanlar genel ve en belirgin özellikleri kapsasa da her şeyi kapsamıyor.

Yanlış anlamayın, Laravel dokümantasyonu iyi, sadece yapabileceğiniz çok şey var ve her şeyi dokümana dökmek zor. Bu yüzden Laravel içindeki gizli cevherlere bir göz atacağız.

Basamaklı Görünümler (Cascading Views)

V4.0.0 ile eklenmiş, dokümanlarda yer almıyor.

 

Görünüm (view) dosyaları da ayar (config) dosyaları gibi basamaklı hale gelebilir. Basamaklı görünümler geliştirilebilir bir tema sistemi çok kullanışlı olabilir. Şöyle bir dizin yapınızın olduğunu varsayın:

/app
    /views
        /blog
            /index.blade.php
/themes
    /default
        /views
            /blog
                /index.blade.php
            /theme.blade.php

Buradaki düşünce return View::make(‘theme::blog.index’); kullandığımızda ilk önce themes/default/views içerisine bakmasını, eğer görünümü bulamazsa app/views klasörüne bakmasını sağlamak. Bunu yapmak için yapmamız gereken ise View::addNamespace yöntemini kullanarak kendi isim alanımızı (theme) iki farklı yol ile kaydetmek:

View::addNamespace('theme', [
    base_path().'/themes/default/views',
    app_path().'/views'
]);

 

Koleksiyonlar (Collections)

V4.0.0 ile eklenmiş, dokümanlarda kısmen yer alıyor.

 

Koleksiyonlar dizilerle (array) uğraşmak ve onları yönetmek için harika bir yol. Bir çok kullanışlı yöntem barındırıyorlar ve ArrayableInterfaceIteratorAggregate, ve JsonableInterface gibi arayüzlere (interface) sahipler.

Diyelim ki dosya sistemini depo (storage) olarak kullanacak küçük bir blog sistemi geliştiriyoruz ve sıralama, filtreleme ve sayfalama gibi veritabanı işlemlerinde kullanabildiğimiz yöntemleri kullanmak istiyoruz. Böyle bir blog sistemini geliştirmek bu makalenin konusu dışında elbette ama $articles isimli bir dizimiz olduğunu ve her bir elemanının Article sınıfının bir türevi (instance) olduğunu hayal edelim. Yapmamız gereken yeni bir Collection sınıfı türevi oluşturmak:

$articles = new Illuminate\Support\Collection($arrayOfArticles);

Sıralama

Üstte oluşturduğumuz koleksiyon ile artık sıralama işlemi yapabiliriz. Şimdi makalelerimizi en son güncellenen makale en üstte olacak şekilde sıralayalım. Makalelerin son güncelleme tarihlerini updatedAt özelliğinde tutuğumuzu varsayarsak:

$articles->sortByDesc(function ($article) { 
    return $article->updatedAt; 
});

sortBy (A-Z/küçükten büyüğe sıralama) ve sortByDesc yöntemleri parametre olarak dönüş fonksiyonu (callback) kabul ediyor. Bu fonksiyon koleksiyonu sıralayacağımız özelliği/değeri döndürmeli. Bizim örneğimizde,  makalelerin son güncelleme tarihlerini döndürebilir ve koleksiyonumuzu ona göre sıralayabiliriz.

Filtreleme

Sıralamaya benzer şekilde, collection kullanarak makalelerimizi SQL’de bulunan WHERE ifadesinin yaptığı şekilde filtreleyebiliriz.  Şimdi makalelerimizi bazı arama kelimelerine göre filtreleyelim:

$searchQuery = 'Laravel rocks!';
 
$results = $articles->filter(function ($article) use ($searchQuery) {
    return preg_match(sprintf('/%s/m', $searchQuery), $article->body);
});

Filter yöntemi yeni bir Illuminate\Support\Collection döndürdüğünden $result değişkenine atıyoruz.  Bu dönen yeni koleksiyon sadece body özelliğinde “Laravel rocks!” geçen veriyi barındıracaktır.

Sayfalama

Tek bir sayfada çok fazla makale olmaması için koleksiyon kullanarak makalelerimizi sayfalayabiliriz.

$perPage = 1;
 
$page = Input::get('page', 1);
 
if ($page > ($articles->count() / $perPage)) {
    $page = 1;
}
 
$pageOffset = ($page * $perPage) - $perPage;
 
$results = $articles->slice($pageOffset, $perPage);

Slice yönetimi kullanarak koleksiyondaki makalelerimizin bir bölümünü çekerek $result değişkenine atıyoruz.

Daha fazlası var!

Rastegele bir makale getirebiliriz:

$article = $articles->random();

Ayrıca makale koleksiyonumuzu IteratorAggregate ve ArrayIterator sayesinde normal bir diziymiş gibi yineleyebiliriz:

foreach ($articles as $article) {
    echo $article->body;
}

Hatta makalelerimizi normal bir diziye ya da JSON formatına çevirebiliriz:

$array = $articles->toArray();
$json = $articles->toJson();

En harika yöntemlerden bir tanesi de muhtemelen makalelerimizi belli bir anahtara göre gruplamamızı sağlayabilen groupBy yöntemidir. Her bir makalenin içerisinden ayrıştırılmış ve çıkarılmış bir kategori adı gibi verisi olduğunu düşünün.

Her ne kadar ayrıştırma bu makalenin dışında olsa da, bu veriyi ayrıştırılmış ve Article sınıfının sahip olduğu bir özellik olarak farz edeceğiz. Böylece groupBy ile makaleleri yayınlandıkları kategoriye göre gruplayabileceksiniz.

$results = $articles->groupBy('category');

Aynı kategoriyi paylaşan tüm kategoriler gruplanmış olacak.  Belli bir kategoriye ait makaleleri alabileceksiniz:

foreach ($results->get('tutorial') as $article) { 
    echo $article->body; 
}

Koleksiyonlar Laravel’in sahip olduğu gizli cevherilerin en iyilerinden bir tanesi.

 

Düzenli İfade (Regular Expression) Filtreleri

V4.1.19 ile eklenmiş, dokümanlarda yer almıyor.

 

Rotaları (route) filtrelemek birçoğumuzun projelerinde yaptığı genel bir işlem. Bir filtre rota ateşlendikten önce ya da sonra, kullanıcı doğrulama ya da oran sınırlama gibi işlerin gerçekleştirilmesine olanak sağlar. Route::filter kullanarak filtre oluşturur ve onları birbirinden ayrı rotalara, bir rota grubuna ya da Route::when kullanarak uyuşan bir desene (pattern) atayabiliriz.

Route::filter('restricted', function($route, $request, $group)
{
    // Restrict user access based on the value of $group
});

Route::when('admin/*', 'restricted:admin');

Bu örnekte, $group isimli bir parametre bekleyen restricted filtresi oluşturuyoruz. $route ve $request parametreleri her zaman filtreden önce verilir.

Peki ya daha fazla esneklik istersek? Diyelim ki filtreyi admin/login hariç tüm admin rotalarına uygulamak istiyoruz. Bir rota grubu kullanıp bahsi geçen rotayı bu grubun dışına alabiliriz ya da Route::whenRegex kullanabilir ve kendi düzenli ifademizi yazabiliriz:

Route::whenRegex('/^admin(\/(?!login)\S+)?$/', 'restricted:admin');

Bu düzenli ifade kısaca filtrenin sadece admin ile başlayan ve /login ile devam etmeyen fakat onun haricinde herhangi bir şey ile devam eden rotalara uygulanmasını sağlar. Mükemmel. Şimdi admin/login rotamız dışında tüm rotalara restreicted:admin filtremizi uygulamış olduk.

 

MessageBag

V4.0.0 ile eklenmiş, dokümanlarda kısmen yer alıyor.

 

Hiç şüphesiz uzun süredir farkında olmadan Illuminate\Support\MessageBag kullanıyorsunuzdur. MessageBag’in oynadığı en büyük rol, Laravel’in bütünleşik doğrulayıcısının (validator) hata mesajlarını taşımasıdır.

Her görünümde boş ya da oturuma Redirect::to(‘/’)->withErrors($validator) ile yakılmış,  MessageBag instance taşıyan bir $error değişkeni mevcuttur.

Büyük bir ihtimal birçoğunuz formlarınızda, belli bir input altında hata mesajı göstermek için şöyle bir şey yapıyorsunuzdur:

{{ Form::text('username', null) }}
@if($errors->has('username'))
    <div class="error">{{ $errors->first('username') }}></div>;
@endif

Aslında if ifadesini kaldırıp first yönteminin ikinci parametresini kullanarak mesajı bir div içerisine alabilirsiniz:

{{ Form::text('username', null) }}
{{ $errors->first('username', '<div class="error">:message</div>') }}

Böyle çok daha iyi!

 

Fluent

V3.0.0 ile eklenmiş, dokümanlarda kısmen yer alıyor.

 

Fluent sınıfı uzunca bir süredir var ve frameworkün kendi içerisinde schema builder ile migrasyon oluşturmada kullanılıyor. Laravel 3 ve 4 arasında sınıf çok az bir değişiklik yaşadı, en büyük fark sadece birkaç fazladan interface.

Fluent sınıfını yapmanız için tek gereken bir instance çağırmak:

$user = new Illuminate\Support\Fluent;
$user->name('Jason')->country('Australia')->subscriber();

Instance şimdi 3 tanımlanmış özelliğe sahip oldu, Jason değerini almış name, Australia değerini almış country ve boolean true değerini almış olan subscriber.

Laravel 4.1 e kadar instance’a sadece özellik tanımlayabiliyor (set) ve çağırabiliyordunuz (get). 4.1’den itibaren ise toArray ve toJson yöntemlerini kullanabiliyorsunuz.

 

Kaynak:

http://code.tutsplus.com/articles/five-hidden-gems-of-laravel--cms-21907

Laravel'in Gizli Cevherleri

Laravel dokümanlarında yer almayan fakat yükünüzü hafifletecek gizli kalmış 5 cevher, harika ipuçları!

19.10.2014

Yorumlar