Laravel'de Görünüm Bileşenlerinin Tanıtılması, Bestecilerin Görüntülenmesine Bir Alternatif

Yazılım geliştirmede, “en iyi uygulamalar” dan biri, gerektiğinde uygulamanızın farklı bölümlerinde uygulanabilecek yeniden kullanılabilir kod oluşturmaktır.

Bir blogunuz olduğunu ve bir kenar çubuğunda "vurgu" widget'ını göstermeniz gerektiğini düşünün.

“Önemli noktalar” bir API'nın yanıtıyla doldurulacak.

Yani, ana sayfa denetleyicinizde muhtemelen aşağıdakine benzer bir şeyiniz olabilir:

<?php

class HomeController extends Controller {

protected $blog;

public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}

public function index()
{
return view('blog', [
'posts' => $blog->latest(),
'highlights' => $blog->highlights()
]);
}
}

Güzel ve temiz, ancak bu yaklaşım, sitenizin her sayfasına aynı "vurgu" değişkenini iletmeniz gerektiğinde bir sorun olmaya başlıyor; örneğin bir iletişim sayfası:

<?php

class ContactPageController extends Controller {

protected $blog;

public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}

public function index()
{
return view('contact', [
'highlights' => $blog->highlights()
]);
}
}

20 farklı kontrol cihazınız varsa ne olacağını hayal edin; Çok fazla kod çoğaltmaya sahip olabilirsiniz ve uygulamanız büyüdükçe bunu korumak daha zor olacaktır.

Laravel'in bestecilerini kullanıyor

Bileşenleri görüntüle, mantığı denetleyicinizin dışına taşımanıza ve verileri belirtilen görünümler kümesine geçirmenize izin verir.

<?php

class HighLightsComposer
{

protected $users;

public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}

public function compose(View $view)
{
$view->with('highlights', $this->blog->highlights());
}
}

Ve sonra servis sağlayıcınızda böyle bir şeye sahip olacaksınız:

<?php

class ComposerServiceProvider extends ServiceProvider
{
public function boot()
{
View::composer(
'highlights', 'App\Http\ViewComposers\HighlighsComposer'
);
}
}

Bu noktada kontrol cihazlarınızı şu şekilde yeniden düzenleyebilirsiniz:

<?php

class HomeController extends Controller {

protected $blog;

public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}

public function index()
{
return view('blog', [
'posts' => $blog->latest()
]);
}
}

class ContactPageController extends Controller {

public function index()
{
return view('contact');
}

}

Ürün hakkında düşünmek

İlk bakışta, bu harika görünüyor, ama biraz düşünelim.

“Görüntü bestecilerini” kullandığınızda, bu işlem biraz sihir ve özellikle Laravel'i kullanan çok fazla deneyimi olmayanlar için o kadar da net olmayan bir uygulamada çalışıyor.

Müşterinizin, "vurgular" widget'ının içeriğini statik bir şey için değiştirmenizi istediğini varsayalım. Mevcut örnekte, bunu "highlights.blade.php" dosyanızın içeriğini güncelleyerek yapabilirsiniz.

Uygulama beklendiği gibi çalışır, ancak API çağrısı arka planda (Görünüm Bestecisinde) çalışır.

Dolayısıyla, mantığı görüntülemelerinizden kaldırırsanız, görünümdeki adı değiştirmeniz veya ViewComposer'dan API çağrısını durdurmak için ServiceProvider'ı güncellemeniz gerekir.

Görünüm Bileşenlerini Kullanma

Şu an üzerinde çalıştığım projelerden birinde kullandığım bir yaklaşımdır, adını verdim, istediğin gibi aramaktan çekiniyorum.

İstediğimiz, dinamik veriler (herhangi bir kaynaktan gelen) kullanılarak oluşturulacak ortak bir görünümü yeniden kullanmaktır.

Yeni bir Highlights bileşen sınıfı oluşturma

Bu “Bileşeni Görüntüle” sınıfları, geri dönmek istediğimiz veri türünü belirtmek için bir arabirimi veya sözleşmeyi paylaşabilir. Bu durumda Laravel'in Htmlable sözleşmesi mükemmel bir şekilde Htmlable .

<?php

namespace App\ViewComponents;

use Illuminate\Support\Facades\View;
use Illuminate\Contracts\Support\Htmlable;

class HighlightsComponent implements Htmlable
{
protected $blog;

public function __construct(BlogRepository $blog)
{
$this->blog = $blog;
}

public function toHtml()
{
return View::make('highlights')
->with('highlights', $this->blog->highlights())
->render();
}
}

Görünüm bileşenlerini oluşturmak için yeni bir bıçak yönergesi oluşturma

Yukarıdaki sınıfta bağımlılık enjeksiyonu kullandığımız için, bizim için bu bağımlılıkları çözmek için IOC'yi kullanmak iyi bir fikir olacaktır.

<?php

class AppServiceProvider extends ServiceProvider
{
public function register()
{
Blade::directive('render', function ($component) {
return "<?php echo (app($component))->toHtml(); ?>";
});
}
}

Son olarak, herhangi bir görünümde bir HTML kısmi döndürecek görünüm bileşenini “işleyebilir”.

// home.blade.php

@render(\App\ViewComponents\HighlightsComponent::class)

Wrapping up

Bu yaklaşımı kullanarak, karmaşık bileşenleri, uygulamanızdaki herhangi bir görünümde dinamik verileri kullanarak yeniden kullanabilirsiniz.

Bileşen mantığı sadece, @render() blade yönergesiyle @render() .

Büyük bir geliştirici ekibiyle çalışıyorsanız, uygulamanın arka planında uygulamayı güncellemeden görünümdeki widget'ın uygulanmasını değiştiren biri olursa, uygulamanızın performansının etkilenmeyeceğinden emin olabilirsiniz.

Bir önceki yazımız olan Kıyaslama DigitalOcean Blok Depolama başlıklı makalemizi de okumanızı öneririz.

About This Author

Comments are closed

%d blogcu bunu beğendi: