Giriş yap

Laravel Blade Özel Direktif Oluşturma

Blade, bildiğiniz gibi Laravel'in template motoru. Ve kendine özel syntax'ı ile, view'larda doğrudan php yazmadan daha okunabilir kodlar yazmamızı sağlıyor. Ve view dosyalarımızda @ işareti ile başlayarak kullandığımız komutların adları direktif. Bazen özel olarak kendimize ait direktifler tanımlamak isteyebiliriz. Bu makalede size nasıl özel direktif tanımlayabileceğinizi göstereceğim.

En basit haliyle bir direktif şu şekilde tanımlanır;

Blade::directive('direktif_adi', function($expression){
    return $expression;
});

Bu direktifi ister controller dosyanızda tanımlayıp sadece orada kullanın (ki bu mantıklı değil) ya da AppServiceProvider dosyanızda boot() metodu içinde tanımlayın ve her yerde kullanın.

Eğer controller dosyanızda kullanacaksanız önce dosyanızın başına şunu ekleyin;

use IlluminateSupportFacadesBlade;

Daha sonra metodun içinde şu şekilde tanımlayabilirsiniz;

..

public function index()
{

    ..

    Blade::directive('text', function($express){
        return $express;
    });

    ..
}

..

Ve view'da @text(hello world) şeklinde kullandığınızda ekrana yazıyı bastırır sadece. Evet bu direktif bir işe yaramıyor :D Çünkü daha anlamlı direktifler yazmanız gerekiyor.

Şimdi global olarak birkaç tane direktif tanımlayalım. Bunu app/Providers/AppServiceProvider.php dosyasında boot() metodunda tanımlıyoruz.

<?php

use IlluminateSupportFacadesBlade;
    
class AppServiceProvider extends ServiceProvider
{
    ..
    public function boot()
    {
        Blade::directive('style', function($expression){
            if (!empty($expression)) return '<link rel="stylesheet" type="text/css" href="' . mix('css/' . $expression) . '">';
            return '<style>';
        });

        Blade::directive('endstyle', function(){
            return '</style>';
        });

        Blade::directive('page', function($expression){
            return "<?php if (request()->routeId('{$expression}')){ ?>";
        });

        Blade::directive('endpage', function(){
            return "<?php } ?>";
        });
    }
    ..
    

Ve artık view sayfalarımızda şu şekilde kullanabiliriz;

@page(profile)
    buraya profile özel içerik eklenecek
@endpage

@style
body {
    background-color: red;
}
@endstyle

@style(users.css)

Son olarak isterseniz Blade::if() ile şu şekilde bir kullanımda mevcut;

Blade::if('home', function(){
    return request()->routeIs('index');
});

Bu şekilde tanımladığınızda @home @else ve @endhome direktifleri otomatik olarak kullanılabiliyor. Yani;

@home
    burası anasayfa
@else
    burası anasayfa değil gibi :(
@endhome
tayfunerbilen
34 gün önce yazdı.
Günlük Film Tavsiyesi