
Tap, Tap, Tap – Laravel
Merhaba arkadaşlar bu makalede Laravel’de helper fonksiyonlarından tap’i anlatacağım.
Öncelikle Taylor Otwell’in de dediği gibi “Tap, Tap, Tap” 🙂
Taylor “tap” için favorilerimden biridir der. tap fonksiyonunu Ruby’den esinlenmiş.
<?php function tap($value, $callback) { if (is_null($callback)) { return new HigherOrderTapProxy($value); } $callback($value); return $value; }
Evet gördüğünüz gibi tap fonksiyonun mantığı yukarıda ki kod satırlarından ibaret 🙂
Mesela user’ı kaydetmek istediğimizde kullandığımız create metodunu kullanırız örneğin; User::create($userAttributes); gibi.. arka planda çalışan metod aşağıda ki gibidir.
/** * Save a new model and return the instance. * * @param array $attributes * @return \Illuminate\Database\Eloquent\Model|$this */ public function create(array $attributes = []) { return tap($this->newModelInstance($attributes), function ($instance) { $instance->save(); }); }
Örnekte’de olduğu gibi yeni bir eloquent modelin instance’sini / örneğini alır, DB’ye kayıt eder ve model’in almış olduğu instance’sini döndürür. Sizi bir kaç kod satırından ve geçici değişken tanımlamaktan kurtarır. Kod okunabilirliğini sağlar. Eğer create metodu içerisinde “tap” kullanılmasaydı muhtemelen kodumuz şöyle olurdu;
public function create(array $attributes = []) { $instance = $this->newModelInstance($attribtues); $instance->save(); return $instance; }
Konunun anlaşılması için bir örnek daha..
return tap($user)->update([ 'name' => $name, 'age' => $age, ]);
Koda dikkat ettiniz mi? Normal olarak Eloquent Modelinde “update” metodu boolean döndürür fakat “tap” ile user modelinin dönmesini sağladık.
Tap in Laravel Collection
Laravel 5.4’de collectionlara tap eklendi. Mesela ben collectionlar ile çalışırken debug işlemlerinde tap kullanıyorum. Örneğin;
return collect($articles) ->tap(function ($articles) { dump($articles); }) ->filter(function ($article) { // return something }) ->tap(function($articles){ dump($articles); });
Bir hatırlatmakta yapmakta faydar var. “tap” ile “pipe” benzer işleri yapsalarda aralarında önemli bir farklılık var. “tap” ile collection içerisinde ki dataya erişsenizde collection üzerinde değişiklik yapamazsınız. “pipe” ise değişiklik yapabilirsiniz. Bir örnek ile açıklamak gerekirse;
$articles = collect($articles) ->tap(function ($articles) { return $articles->pluck('id'); }) ->filter(function ($article) { return $article['id'] == 1; }) ->pipe(function($articles){ return $articles->pluck('title'); }); dd($articles);
Yukarıda ki kod satırlarını debug ettiğinizde tap’in modifiye etmediğini pipe’nin ise ettiğini göreceksiniz. Çıktı ise şu şekilde olacaktır.
Collection {#2999 ▼ #items: array:1 [▼ 0 => "Title 1" ] }
Adam Wathan’ın twitter’da paylaştığı bir görseli buraya bırakayım.
Bu şekilde kullanım alanlarını çoğaltmak mümkün 🙂 Benimde sevdiğim ve kullandığım yardımcı fonksiyonlardan biri olduğu için blogumda paylaşmak istedim.
Sevgiler..