Laravel

Cara Membuat dan Menggunakan Controller di Laravel

06 Jun 2026 Administrator
Header Hero

Cara Membuat dan Menggunakan Controller di Laravel

Panduan Menguasai Arsitektur MVC, Resource Controller, Dependency Injection, dan Manajemen Request-Response

Dalam arsitektur pengembangan web berbasis *Model-View-Controller* (MVC), **Controller** bertindak sebagai otak utama yang mengatur lalu lintas logika aplikasi. Ketika sebuah permintaan HTTP (*HTTP Request*) masuk melalui rute (*Route*), rute tersebut tidak bertugas memproses data, melainkan langsung menyerahkannya ke Controller. Di sinilah seluruh keputusan diambil: Controller akan menerima input, berinteraksi dengan **Model** untuk mengolah database, menerapkan validasi keamanan, dan akhirnya menentukan **View** atau respons JSON apa yang harus dikembangkan kepada pengguna.

Memasukkan seluruh logika bisnis langsung ke dalam file rute (*closure routes*) sangat tidak direkomendasikan karena akan membuat kode program menjadi berantakan dan sulit diuji (*untestable*). Dengan mengisolasinya ke dalam kelas Controller, Anda dapat mengelompokkan perilaku rute yang saling berhubungan ke dalam satu wadah modular. Panduan komprehensif ini akan membahas tuntas cara kerja Controller di Laravel, mulai dari tipe penulisan dasar, otomatisasi *Resource*, injeksi dependensi, hingga penanganan validasi form.

Lokasi Berkas: Semua file Controller yang Anda buat menggunakan perintah Artisan akan otomatis tersimpan di dalam direktori app/Http/Controllers/.

1. Membuat Berkas Controller Menggunakan Artisan

Laravel menyediakan generator CLI Artisan yang sangat fleksibel untuk mempermudah pembuatan kerangka awal (*scaffolding*) Controller:

# 1. Membuat Controller dasar kosong
php artisan make:controller UserController

# 2. Membuat Resource Controller (Otomatis memuat 7 method CRUD standar)
php artisan make:controller PostController --resource

# 3. Membuat API Controller (Sama seperti resource, tapi tanpa method bentuk form HTML)
php artisan make:controller Api/OrderController --api

# 4. Membuat Controller di dalam sub-folder/sub-namespace khusus
php artisan make:controller Admin/DashboardController

Berikut adalah contoh implementasi metode tindakan (*action methods*) di dalam berkas dasar UserController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
    // Menampilkan daftar seluruh data
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }

    // Menampilkan satu data spesifik berdasarkan parameter ID URL
    public function show(string $id)
    {
        $user = User::findOrFail($id);
        return view('users.show', compact('user'));
    }
}
Routing

Menghubungkan Rute ke Metode Controller

Mulai Laravel 8 ke atas, konvensi penyambungan rute ke Controller direkomendasikan menggunakan format array callable untuk menghindari kesalahan ketik string namespace:

// routes/web.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

// Format: [NamaClassController::class, 'namaMethod']
Route::get('/users', [UserController::class, 'index'])->name('users.index');
Route::get('/users/{id}', [UserController::class, 'show'])->name('users.show');
RESTful Resource

2. Otomatisasi dengan Resource Controllers

Jika aplikasi Anda mengadopsi standar arsitektur RESTful CRUD, Anda tidak perlu mendeklarasikan rute `GET`, `POST`, `PUT`, dan `DELETE` satu per satu. Cukup gunakan metode makro Route::resource:

// Men-generate rute CRUD lengkap (Index, Create, Store, Show, Edit, Update, Destroy) otomatis
Route::resource('posts', PostController::class);
Injeksi Dependensi

3. Penerapan Dependency Injection Melalui Constructor

Laravel Service Container secara otomatis mendeteksi objek kelas yang dideklarasikan pada parameter konstruktor Controller Anda. Teknik ini mempermudah proses pemisahan komponen dan unit testing:

namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller
{
    protected $userModel;

    // Injeksi objek Model User ke dalam konstruktor secara otomatis
    public function __construct(User $user)
    {
        $this->userModel = $user;
    }

    public function index()
    {
        $users = $this->userModel->all();
        return view('users.index', compact('users'));
    }
}

4. Ekstraksi Data Request & Penerapan Validasi

A. Mengekstrak Parameter Form Input

Gunakan objek instansiasi kelas Illuminate\Http\Request untuk menangkap payload data yang dikirim oleh pengguna:

public function store(Request $request)
{
    // Mengambil seluruh payload data input form
    $allInput = $request->all();

    // Mengambil data spesifik berdasarkan nama key input atribut
    $name = $request->input('username');
    $email = $request->email; // Akses jalan pintas via dynamic properti

    // Mengambil nilai input dengan nilai cadangan (Default Value) jika input kosong
    $theme = $request->input('theme', 'dark');

    // Mengisolasi data tertentu saja (Sangat direkomendasikan demi alasan keamanan)
    $secureData = $request->only(['username', 'email', 'password']);
}

B. Menjalankan Validasi Keamanan Data (Validation Block)

Gunakan fungsi validate() langsung di dalam metode Controller. Jika validasi gagal, Laravel otomatis mengembalikan user kembali ke halaman form asal beserta error biner pembawa pesan galat:

public function store(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users,email',
        'password' => 'required|string|min:8|confirmed',
    ]);

    // Jika kode sampai di baris ini, berarti validasi lolos sukses
    User::create($validated);

    return redirect()->route('users.index')->with('success', 'User berhasil ditambahkan!');
}

5. Ragam Tipe Pengembalian Respons (Responses)

Controller berkewajiban mengembalikan objek interaktif sebagai balasan kueri dari browser atau aplikasi klien:

// 1. Mengembalikan Tampilan Blade (View Response)
return view('users.index', compact('users'));

// 2. Mengembalikan Data API Berstruktur JSON (JSON Response dengan HTTP Status)
return response()->json([
    'success' => true,
    'data' => $users
], 200);

// 3. Mengalihkan Rute (Redirect Response dengan Session Flash)
return redirect()->route('users.index')->with('success', 'Operasi sukses!');

// 4. Mengalihkan Kembali ke Halaman Sebelumnya dengan Menyertakan Input Asal
return redirect()->back()->withInput();
Praktik Terbaik Manajemen Logika Controller

Ikuti standar penulisan kode tingkat lanjut berikut untuk menjaga arsitektur aplikasi Anda tetap clean dan teratur:

  • Prinsip "Skinny Controller, Fat Model": Jaga ukuran baris file Controller Anda tetap ramping. Controller hanya bertugas mengatur alur kendali (*HTTP traffic routing*). Jangan meletakkan logika kalkulasi data SQL yang rumit di dalam Controller; pindahkan logika komputasi data tersebut ke dalam lingkup Eloquent Model, *Repository Pattern*, atau *Service Classes*.
  • Gunakan Form Request Untuk Validasi Kompleks: Jika baris array validasi Anda terlalu panjang, pisahkan dari Controller menggunakan perintah php artisan make:request StoreUserRequest agar logika validasi terisolasi dengan rapi.
  • Manfaatkan Middleware untuk Proteksi Akses: Jangan melakukan pengecekan status login manual menggunakan klausa `if` di setiap method. Pasang pengaman hak akses menggunakan kontrol **Middleware** baik langsung di file rute atau via metode konstruktor Controller Anda.
v