Sintaks {{ }} sudah kita kenal, tetapi data yang dikirim controller tidak selalu berupa string sederhana. Dalam aplikasi nyata, view menerima nama pengguna dari object, daftar kolom dari array, konfigurasi untuk JavaScript, sampai input mentah dari pengguna lain. Setiap bentuk data punya cara akses dan jebakannya masing-masing. Chapter ini membedah cara Blade menampilkan scalar, properti object, elemen array, nilai yang mungkin tidak ada, hingga JSON yang aman untuk JavaScript.

Menampilkan Scalar, Object, dan Array #

Di dalam {{ }} kita bisa menulis ekspresi PHP apa pun, sehingga cara akses data mengikuti bentuk datanya. Properti object diakses dengan tanda panah (->), elemen array dengan kurung siku (['kunci']). Pemanggilan function dan operasi aritmetika juga sah di dalam kurung kurawal — {{ strtoupper($kode) }} atau {{ $harga * $jumlah }} — karena hasil ekspresi itulah yang dikirim ke e() lalu dicetak. Perhatikan view profil.blade.php berikut yang menerima object $pengguna dan array $perusahaan:

blade
<h1>{{ $pengguna->nama }}</h1>
<p>Email: {{ $pengguna->email }}</p>
<p>Perusahaan: {{ $perusahaan['nama'] }} ({{ $perusahaan['kota'] }})</p>
<p>Pembina: {{ $pembina ?? 'belum ditentukan' }}</p>

Controller mengirim data sebagai object anonim dan associative array:

php
view('profil', [
    'pengguna' => (object) ['nama' => 'Budi Santoso', 'email' => '[email protected]'],
    'perusahaan' => ['nama' => 'PT Maju Bersama', 'kota' => 'Bandung'],
]);

Output yang Dihasilkan:

text
<h1>Budi Santoso</h1>
<p>Email: [email protected]</p>
<p>Perusahaan: PT Maju Bersama (Bandung)</p>
<p>Pembina: belum ditentukan</p>

Baris pertama dan kedua membaca properti object dengan $pengguna->nama. Baris ketiga membaca elemen array dengan $perusahaan['nama']. Model Eloquent menggabungkan keduanya: atribut model bisa diakses sebagai $post->title sekaligus $post['title'], sehingga kedua gaya penulisan sama sahnya saat data berasal dari database. Pilihan gaya biasanya mengikuti bentuk asal data — object untuk hasil query Eloquent, array untuk hasil DB::table() maupun konfigurasi statis — agar kode terbaca alami.

Nilai Default dengan Null Coalescing #

Baris keempat pada view di atas memakai operator null coalescing (??). Variabel $pembina tidak dikirim controller sama sekali, dan operator ?? mengembalikan operand kanan 'belum ditentukan' saat operand kirinya null atau tidak ada. Tanpa operator ini, Blade melempar exception pada variabel yang tidak terdefinisi — kita buktikan dengan merender profil.blade.php sengaja tanpa data:

text
Illuminate\View\ViewException
Undefined variable $pengguna (View: .../resources/views/profil.blade.php)

Di PHP 8, membaca variabel yang tidak ada memicu warning, dan error handler Laravel mengubahnya menjadi exception — request berakhir HTTP 500. Operator ?? adalah cara ringkas menghadapi data opsional: {{ $judul ?? 'Tanpa judul' }} menghindari error sekaligus memberi nilai default yang bermakna.

Data untuk JavaScript dengan @json #

Saat halaman memuat script yang butuh data dari server, directive @json mengubah array atau object PHP menjadi literal JSON yang valid:

blade
<script>
    window.pengaturan = @json($pengaturan);
</script>

Controller mengirim array konfigurasi biasa:

php
view('pengaturan', ['pengaturan' => ['tema' => 'gelap', 'bahasa' => 'id', 'notifikasi' => true]]);

Output yang Dihasilkan:

text
<script>
    window.pengaturan = {"tema":"gelap","bahasa":"id","notifikasi":true};
</script>

@json bukan sekadar json_encode biasa — Laravel menyaring karakter berbahaya agar data tidak bisa keluar dari tag script. Uji dengan nilai berisi tag HTML dan tanda kutip membuktikannya:

text
window.pengaturan = {"sapaan":"Halo \u003Cb\u003Edunia\u003C\/b\u003E","tanda":"it\u0027s"};

Karakter <, /, dan ' dikonversi menjadi urutan escape unicode, sehingga string apapun isinya tidak akan menutup tag <script> dan menyuntikkan kode.

Escaping Input Pengguna #

Perilaku escaping {{ }} menjadi penyelamat ketika view menampilkan input dari pengguna. Simulasikan komentar berisi injeksi script:

blade
<p>{{ $komentar }}</p>
php
view('komentar', ['komentar' => '<script>location="https://penipu.example"</script> Mantap!']);

Output yang Dihasilkan:

text
<p>&lt;script&gt;location=&quot;https://penipu.example&quot;&lt;/script&gt; Mantap!</p>

Tag script tampil sebagai teks biasa. Pengunjung melihat kode mentahnya, bukan eksekusi script di browser mereka — persis perilaku e() yang kita buktikan pada chapter Blade Template.

Dengan data tampil di halaman, langkah berikutnya adalah mengendalikan bagaimana data ditampilkan: menyembunyikan bagian tertentu, mengulang daftar, atau menyusun cabang logika. Semua itu dikerjakan oleh directive — kosakata @ milik Blade yang kita petakan pada chapter Blade Directives.