Cara Mengirim Data dari Controller ke View di Laravel
Eksplorasi Fungsi compact(), Method chaining with(), Implementasi View Composer, dan Flash Session
Dalam arsitektur *Model-View-Controller* (MVC) yang diusung oleh framework Laravel, pemisahan tugas (*separation of concerns*) diatur dengan sangat tegas. **Controller** bertugas mengeksekusi logika bisnis, memproses data dari model, dan menyiapkan variabel-variabel yang diperlukan. Sementara itu, **View** (berkas biner Blade) bertugas murni untuk mempresentasikan data tersebut menjadi kode HTML interaktif yang dimengerti oleh browser pengunjung. Jembatan komunikasi untuk menyalurkan data hasil pemrosesan dari controller menuju komponen presentasi ini adalah salah satu fondasi utama Laravel.
Laravel menyediakan beragam metodologi intuitif untuk mengirimkan data lintas komponen, mulai dari penggunaan fungsi bawaan PHP seperti compact(), pemanfaatan metode berantai (*method chaining*) with(), hingga teknik tingkat lanjut seperti *View Composer* untuk injeksi data global secara selektif. Memahami variasi pengiriman ini sangat penting agar kode program Anda tetap scannable, modular, dan memiliki efisiensi alokasi memori yang optimal saat merender halaman web.
{{ $nama_variabel }}).
1. Metode Dasar Pengiriman Data
Terdapat tiga cara standar yang paling sering digunakan oleh pengembang Laravel untuk mengoper data harian:
Opsi A: Menggunakan Fungsi compact() (Paling Populer)
Fungsi bawaan PHP compact() akan membaca string nama variabel dan mengubahnya menjadi array asosiatif secara otomatis:
// Di dalam UserController.php
public function show()
{
$name = "Surya Febri Alwari";
$email = "[email protected]";
// Kirim string nama variabel tanpa simbol '$'
return view('user.profile', compact('name', 'email'));
}
Cara menangkap dan menampilkannya di dalam file Blade View (resources/views/user/profile.blade.php):
<h1>Profil Pengguna</h1>
<p>Nama: {{ $name }}</p>
<p>Email: {{ $email }}</p>
Opsi B: Menggunakan Method with() Berantai (*Method Chaining*)
Metode ini sangat fleksibel jika Anda ingin mengirimkan data dengan nama variabel yang berbeda dari variabel aslinya di controller:
public function show()
{
return view('user.profile')
->with('name', 'Surya Febri Alwari')
->with('email', '[email protected]');
}
// Anda juga bisa melemparkan langsung sebuah array asosiatif ke dalam satu fungsi with()
public function index() {
return view('user.profile')->with([
'title' => 'Dashboard SuryaSSH',
'status' => 'Active'
]);
}
Opsi C: Mengirimkan Array Asosiatif Langsung Sebagai Argumen Kedua
public function show()
{
$data = [
'name' => 'Surya Febri Alwari',
'email' => '[email protected]'
];
return view('user.profile', $data);
}
Mengirimkan Objek Eloquent & Koleksi Data (Collections)
Selain tipe data primitif (string, integer, boolean), Anda dapat melemparkan instans objek tunggal dari database hasil query model maupun data massal (*collection*):
// Di dalam Controller Anda
use App\Models\User;
public function index()
{
// Mengambil 10 data user terbaru (Mengembalikan objek Eloquent Collection)
$users = User::latest()->take(10)->get();
$totalUsers = User::count();
return view('users.index', compact('users', 'totalUsers'));
}
Gunakan direktif perulangan @foreach untuk merender data koleksi di dalam file Blade View Anda:
<h1>Daftar Pengguna (Total: {{ $totalUsers }})</h1>
<ul>
@foreach ($users as $user)
<li>{{ $user->name }} - {{ $user->email }}</li>
@endforeach
</ul>
2. Menggunakan View Composers (Injeksi Data Global Berbagi Pakai)
Jika ada data tertentu yang harus selalu muncul di banyak komponen halaman (misalnya daftar kategori di *sidebar* atau info profil user di *header layout*), menulis kuerinya di setiap metode controller tentu sangat buruk. Gunakan **View Composer** untuk membagikan data tersebut secara otomatis ke komponen view spesifik. Daftarkan di dalam berkas app/Providers/AppServiceProvider.php (atau buat Service Provider khusus):
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use App\Models\Category;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
// Otomatis menginjeksikan variabel $categories setiap kali komponen 'layouts.sidebar' dipanggil
View::composer('layouts.sidebar', function ($view) {
$view->with('categories', Category::all());
});
}
}
3. Mengirimkan Data Sementara Melalui Pengalihan (Redirect Flash)
Saat melakukan proses penyimpanan form data, konvensi web mengarahkan rute kembali menggunakan fungsi redirect. Untuk mengirimkan pesan notifikasi sukses sementara, gunakan flash session menggunakan metode with():
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users'
]);
User::create($validated);
// Mengalihkan rute sambil melempar flash session data ber-key 'success'
return redirect()->route('users.index')->with('success', 'Akun pengguna berhasil didaftarkan!');
}
Tangkap data flash session di halaman tujuan menggunakan fungsi helper session():
@if (session('success'))
<div style="background: #dcfce7; color: #15803d; padding: 15px; border-radius: 10px;">
{{ session('success') }}
</div>
@endif
Praktik Terbaik Manajemen Data Antar Lapisan
Ikuti standarisasi baku arsitektur pengiriman data berikut demi kemudahan pemeliharaan (*maintainability*) aplikasi Anda:
- Jaga Blade View Tetap Sederhana: Komponen View hanya bertugas untuk menyajikan data yang sudah matang. Hindari melakukan manipulasi string berat atau kueri database langsung di dalam file Blade (misal melakukan fungsi manipulasi teks substring atau enkripsi kata sandi). Lakukan pemrosesan tersebut di layer Controller.
- Gunakan Eager Loading Guna Mencegah N+1 Queries: Jika View Anda melakukan perulangan data yang memanggil properti relasi (misal menampilkan nama penulis postingan melalui kode
$post->user->name), pastikan Anda memanggil fungsi kueri di controller menggunakan metodewith()(Eager Loading) agar performa database server VPS Anda tetap ringan. - Kirim Data Sesuai Kebutuhan: Batasi pengiriman muatan array massal yang tidak terpakai ke sisi View untuk menghemat konsumsi alokasi memori runtime web server Anda selama siklus kompilasi template Blade.