Badr Interactive Engineering
Berbagi pengalaman untuk menciptakan software yang lebih baik

Membuat Custom Blade Directive

Sebagai pengguna framework Laravel, tentunya kita sangat mengenal Blade Template Engine. Salah satu keuntungan yang kita dapatkan dalam menggunakan Blade dibandingkan hanya penggunakan plain PHP adalah kita dapat menggunakan Blade Directive seperti misalnya @section, @if, @foreach, @inject dan banyak directive lainnya untuk menggantikan kode PHP yang akan kita masukan kedalam halaman view yang kita buat sehingga membuat kode program kita menjadi lebih rapih dan nyaman dilihat.

Dalam artikel ini saya akan membahas tentang bagaimana membuat Blade Directive baru sesuai dengan kebutuhan kita seperti misalnya @checkuser, @isadmin atau @dateformat. Untuk dapat mendefinisikan Blade Directive baru kita dapat menggunakan fitur Blade::directive() yang telah disediakan oleh Laravel. Sebagai contoh, kita ingin membuat sebauh directive bernama @datetime yang secara otomatis akan mengkonversikan forma tanggal database YYYY-mm-dd menjadi format mudah dibaca oleh user seperti dd/mm/YYYY. Untuk dapat melakukan hal tersebut kita perlu menambahkan beberapa baris kode pada class App\Providers\AppServiceProvider seperti berikut ini:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('datetime', function($expression) {
            return "<?php echo with{$expression}->format('m/d/Y H:i'); ?>";
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Jika melihat contoh kode diatas, kita mengetahui bahwa Blade Directive hanyalah sebuah pengganti dari PHP experssion yang kita definisikan. Apabila kita pernah menggunakan directive @if dan @endif maka directive tersebut hanyalah pengganti dari <?php if($experssion) {?> dan <?php } ?> atau <?php if($expession) : ?> dan <?php endif; ?> (kalau menggunakan php control structure alternative syntax). Oleh karena itu, kita juga dapat membuat directive seperti @if dan @endif seperti misalnya @admin dan @endadmin untuk melakukan pengecekan apakah user tersebut memiliki role admin atau tidak. Untuk dapat membuat directive seperti itu kita cukup menambahkan kode didalam method boot() seperti dibawah ini:

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Blade::directive('admin', function($expression) {
        return "<?php if (Auth::user()->role === 'admin') { ?>";
    });

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

Yup, begitulah. Selamat mencoba :)