İçeriğe geç

Özel Laravel Blade Directive Oluşturma ve Kullanımı

Laravel Blade yapısını kullanarak view dosyalarını daha okunaklı hale getirebilirsiniz. Blade Directive ise PHP kodlarını HTML kodları içerisine okunaklı şekilde gömmenizi sağlar. Örnek olarak genel olarak kullandığımız @if, @foreach, @isset fonksiyonları verilebilir.

Bu içerikte kendi özel Blade Directive’inizi oluşturup kullanalım. Blade Directive örnek yapısı şu şekildedir;

Blade::directive('directive_name', function () {
	return 'My First Blade Directive';
});

Bu kodu app/Providers/AppServiceProvider.php sayfası boot() metoduna eklemeniz gerekiyor.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade; // import işlemini unutmayın.
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{

    public function register()
    {
        //   
    }

    public function boot()
    {
        Blade::directive('directive_name', function () {
            return 'My First Blade Directive';
        });
    }
}

View klasöründeki blade dosyasında kullanımı;

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Custom Blade Directives</title>
    </head>
    <body>
        @directive_name()
    </body>
</html>

Örneğimizde; “My First Blade Directive” çıktınızı almış olacaksınız.

Şimdi de örneğimize ek özellikler ekleyelim;
Anasayfa’da olup olmadığımızı kontrol eden bir yapı kuralım;

public function boot()
    {
        Blade::directive('isHome', function () {
            $isHomePage = false;

            // check if we are on the homepage
            if ( request()->is('/') ) {
                $isHomePage = true;
            }

            return "<?php if ($isHomePage) { ?>";
        });

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

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

app/Providers/AppServiceProvider.php dosyasındaki boot() metoduna directive oluşturmuş olduk. Daha sonra kontrol için kullanacağımız iki route oluşturalım.

Route::get('/', function () {
    return view('welcome');
});

Route::get('/posts', function(){
    return view('welcome');
});

Ansayfa konrtolu yapacağımız sayfalara oluşturduğumuz directive komutunu çalıştıralım;

//dans.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Adding Functionality to Custom Blade Directives</title>
    </head>
    <body>
        @isHome
            <p>We are on the homepage</p>
        @notHome
            <p>We are on a different page than the homepage</p>
        @endHome
    </body>
</html>

Anasayfa ve /posts url’leri aynı view dosyasını çalıştıracaktır. Ancak; anasayfadaykenWe are on the homepage” uyarısını alırken, /posts sayfasında “We are on a different page than the homepage” uyarısı görünecektir.

Özel Blade “If” Directive’leri

Laravel Blade If Directive’i kullanarak daha etkili yapılar oluşturulabilir. Önceki örnek üzerinden kullanımı şöyledir;

// app/Providers/AppServiceProvider.php dosyası, boot() metoduna eklenecek yapı.
Blade::if('isHome', function () {
    return request()->is('/');
});

View dosyanızdaki blade kodlarını şu şekilde değiştirmelisiniz;

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Custom Blade Directives</title>
    </head>
    <body>
        @isHome
            we are on home
        @else
            not home
        @endisHome
    </body>
</html>

Blade Directive’lere Parametre Atama

Blade Directive’lerine parametre göndererek yapılarınızda kullanabilirsiniz. Basit bir örnekte bu durumu anlatacak olursak; örneğimizde @greet directive’i ile verilen ismi ekrana yazdıracağız.

// app/Providers/AppServiceProvider.php dosyası, boot() metoduna eklenecek yapı.
public function boot()
    {
        Blade::directive('greet', function ($name) {
            return "<?php echo 'Hello ' . $name ?>";
        });
    }

View dosyasında kullanımı;

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Custom Blade Directives</title>
    </head>
    <body>
        @greet('Dans')
    </body>
</html>

Sayfayı kontrol ettiğinizde ekrana “Hello Dans” basacaktır.

Blade “If” Directive’lerine Parametre Göndermek

Bu örnekte if/elseif yapısını kullanarak farklı değerlere göre kontrol işlemini yapalım. AppServiceProvider dosyası aşağıdaki gibi olacaktır.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{

    public function register()
    {
        //   
    }

    public function boot()
    {
        Blade::if('env', function ($environment) {
            return app()->environment($environment);
        });
    }
}

View dosyasına @env directive’i ekleyerek uygulamanızın durumunu(local, production vb.) kontrol ettirebilirsiniz.

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Custom Blade Directives</title>
    </head>
    <body>
        @env('local')
            <p>The application is in the local environment</p>
        @elseenv('testing')
            <p>The application is in the testing environment</p>
        @else
            <p>The application is not in the local or testing environment</p>
        @endenv
    </body>
</html>

@elseenv ile farklı durumları kontrol etmiş olduk. Ayrıca AppServiceProvider dışında bir Service Provider dosyası oluşturup directivlerinizi yeni dosyaya eklerseniz daha kolay ve kullanışlı işlemler yapmış olursunuz. Bunun için;

php artisan make:provider BladeServiceProvider


app/Providers/<strong>BladeServiceProvider.php</strong> dosyası oluşmuş olacaktır. Bu dosyadaki boot() metodu içine directive oluşturun. Son olarak bu dosyayı <strong>provider</strong> olarak tanıtmanız gerekiyor. Bunun için <strong>app/config.php</strong> dosyasını açın ve providers dizisini aşağıdaki gibi düzenleyin.
 

'providers' => [

    // Diğer Service Provider Sınıfları
    App\Providers\BladeServiceProvider::class,
    
],

*Not: Her directive oluşturduktan sonra php artisan view:clear komutu ile view dosyalarını temizlemeyi unutmayın.

Kategori:Laravel

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir