Konuya girmeden önce, Kısaca composer view ne işe yaramaktadır onu açıklamak istiyorum.
View Composer'lar web siten içerisinde, birçok sayfada aynı veriyi göstermenizi sağlar. Veri önceden bir fonksiyona yazılarak gerekli view(lar) arasında paylaşılır, böylece sitede bulunan belirli kısımları tekrardan sayfaya göndermek zorunda kalmadan kullanabilirsiniz. Örnek vermek gerekirse Oddlayer'da bulunan ana meninin altında bulundan kategori menüsü yada sıklıkla bir çok sayfada gördüğünüz yan kısımlar view composer'lar aracılığıyla oluşturuldu.
Bu örnekte veri tabanında bulunan haberleri belirlenmiş view'a nasıl göndereceğinizden bahsedeceğim.
Genelde kullanmakta olduğunuz Controller vasıtası ile paylaşılan verinin aksine, bu veri route gerektirmez.
Örenğin:
class NewsComposer{
public function compose(View $view){
$news = DB::table('news')->orderBy('id', 'desc')->get();
$view->with('news', $news);
}
}
ile, doğrudan veriyi gönderebilirsiniz.
Şimdi aşama-aşama tüm adımları tamamlayalım.
1. Öncelikle Composer dosyası otomatik olarak yeni bir projede blunmaz, o yüzden app/Http 'nin içerisinde Composer adında bir dosya oluşturun.
2. Dosyanın içerisinie oluşturmak istediğiniz Composer'u ekleyin örenğin NewsComposer.php
3. Composer'ın içerisinde gerkli veriyi istediğiniz şekilde çekerek, örnekteki gibi ginderin
<?php
namespace app\Http\Composers;
use Illuminate\Support\Facades\DB;
use Illuminate\Contracts\View\View;
class NewsComposer{
public function compose(View $view){
$news = DB::table('news')->orderBy('id', 'desc')->get();
$view->with('news', $news);
}
}
View'a sadece tek bir veri göndermeniz şart değil, dilerseniz aşağıdaki gibi birçok veriyi aynı anda gönderebilirsiniz.
$view->with(['news' => $news, 'posts' => $posts]);
4. Şimdi provider(sağlayıcı) vasıtasıyla composer'dan gelen veriyi view a yönlendirelim.
Bunun için ihtiyacımız olan app/Http/Provider dosyasının içerisinde yeni bir provider oluşturmak. Aslında provider oluşturmak zorunda değilsiniz. var olan providerlardan birini kullanarak aynı işlemi gerçekleştirebilirsiniz, Fakat ben yinede bunu gerçekte yapılması gerektiği gibi yapmayı tercih ediyorum.
Provider'ın ismini belirleyerek bir dosya oluşturun. Örenğin: NewsComposerProvider.php
5. Şimdi aşağıdaki bulunan örnekteki gibi veriyi view'a aktarın:
<?php
namespace app\Providers;
use Illuminate\Support\ServiceProvider;
class NewsComposerProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->composeNews();
}
public function composeNews(){
view()->composer('news', 'app\Http\Composers\NewsComposer');
}
}
Bu kodun tamamı elle yazılmak zorunda değildir, Konsola
php artisan make:provider NewsComposerProvider
Yazarak, Kodun belirili kısmını otomatik oluşturabilirsiniz. Daha sonra composerNews() fonksiyonunu oluşturmanız gerekmektedir. view()->composer('news', 'app\Http\Composers\NewsComposer'); kısmını biraz açıklamak gerekirse. NewsComposer 'dan gelen veriyi, news view'na gönderdik. Dilerseniz veriyi doğrudan ana(master) view a gönderebilirsiniz, fakat bunu yaptığınız taktirde dahi, veriye sadece master viewından ulaşabilirsiniz. Yani başka viewlardan, veriye erişiminiz bulunmaz. İsterseniz
view()->composer('news', 'app\Http\Composers\NewsComposer');
satrının altında birçok satır ekleyerek aynı verıyı dilediğiniz sayıda view'a göndermeniz mümkün. Fakat bunun yerine, veriyi tek bir view'a göndermeniz daha verimli olacaktır.
6. Yapmanız gereken son şey oluşturmuş olduğunuz provider'ı config/app.php nin içerisinde tanımlamaktır:
'providers' => [
/*
* Laravel Framework Service Providers...
*/
app\Providers\NewsComposerProvider::class,
Şimdi objenize, belirlediğiniz view da:
@if(count($news)> 0)
@foreach($news as $new)
<a>
<div > {{$new->title}} </div>
</a>
@endforeach
@endif
Şeklinde ulaşabilir ve ya dilediğiniz gibi kullanabilirsiniz. Bir "if" koşulu ile $news objesini kontrol etmekte fayda vardır.
Bu view'un doğrudan ana(master) view'a bağlı olması gerekmez. Sadece istediğiniz yerde @include('nevs') yazarak, verinizi çıkartabilirsiniz.
Daha fazla bilgi için Laravel dökümantasyonuna gözatabilirsinz: View Composer
Bir hatayla karşılaşırsanız. Yorumlara ekleyebilirsiniz. İyi çalışmalar.
Unutmayın, dilerseniz, sizde kendi yazılarınızı oddlayer'da paylaşabilirsiniz.
Bu yazıyı fazla resmi(ciddi) bulduysanız kusuruma bakmayın. Bu paylaştığım ilk rehber yazısı.
Agil Asadi
yorum yapabilmek için giriş yapmanız gerekmektedir.
agil 2018-08-29 21:39:46
Laravelle ilgili oğrenmek istediğiniz konuları benimle paylaşabilirsiniz. Konu ilgi görecek olursa, daha fazla rehber yazmak isterim