littleScientist
agil
Okuyucu   // 12

Laravel Composer View rehberi

  5 dk okuma süresi 2018-08-29 20:20:35
  ÖNE ÇIKANLARDA BİRİNCİ SIRAYA ÇIKTI
  BU YAZI ÖNE ÇIKAN YAZILARDA YER ALDI

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

    323

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
oddlayer | bütün hakları saklıdır.