Perbedaan Model dan Controller pada Laravel: Memahami MVC, Tugas, dan Contoh Implementasinya
Laravel adalah salah satu framework PHP paling populer yang menerapkan pola arsitektur MVC (Model–View–Controller). MVC bukan sekadar teori, tetapi konsep penting yang akan sangat menentukan bagaimana struktur aplikasi Laravel dibangun, dikembangkan, dan dipelihara dalam jangka panjang.

Banyak pemula Laravel memahami MVC hanya sebatas “Model untuk database, Controller untuk logika, View untuk tampilan”. Penjelasan tersebut memang tidak salah, tetapi terlalu sederhana. Pada praktik nyata, perbedaan Model dan Controller sering membingungkan ketika aplikasi mulai kompleks, terutama saat sudah ada fitur seperti service layer, request validation, middleware, resource, event, job, dan repository.
Kesalahan paling umum adalah menaruh semua logika di Controller sehingga Controller menjadi “gemuk” (fat controller). Kesalahan lainnya adalah menaruh logika bisnis di Model secara berlebihan, sehingga Model menjadi “monster” yang sulit diuji dan sulit dirawat.
Pada artikel ini, kita akan membahas secara lengkap perbedaan Model dan Controller pada Laravel, mulai dari definisi MVC, fungsi masing-masing komponen, peran dalam request lifecycle Laravel, hingga contoh implementasi yang benar agar kode lebih rapi, scalable, dan mudah dipelihara.
Pengertian MVC (Model, View, Controller) dalam Laravel

MVC adalah pola arsitektur perangkat lunak yang memisahkan aplikasi berdasarkan tanggung jawab utama:
- Model → fokus pada data dan aturan pengelolaan data
- View → fokus pada tampilan dan presentasi ke user
- Controller → fokus pada alur request/response dan koordinasi antar komponen
Laravel menggunakan MVC sebagai dasar, tetapi Laravel modern juga menyediakan lapisan tambahan seperti:
- Middleware (filter request)
- Request Validation (validasi input)
- Service Container (dependency injection)
- Events & Listeners
- Jobs & Queue
- Policies & Gates (authorization)
Artinya, Laravel adalah MVC yang “diperluas” untuk kebutuhan aplikasi modern.
Apa Itu Model pada Laravel?
Dalam Laravel, Model adalah class PHP yang umumnya merepresentasikan tabel pada database. Model Laravel dibuat menggunakan Eloquent ORM (Object Relational Mapping), yang membuat database bisa diakses menggunakan objek dan method, bukan query SQL mentah.
Contoh model sederhana:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'price', 'stock'];
}
Model ini biasanya terhubung ke tabel products.
Tugas Utama Model pada Laravel
Secara konsep, Model bertanggung jawab terhadap:
- Representasi data
Model mewakili satu entitas data (misalnya User, Product, Order). - Operasi CRUD melalui Eloquent
- Create
- Read
- Update
- Delete
- Relasi antar tabel
Model bisa punya relasi seperti:- hasOne
- hasMany
- belongsTo
- belongsToMany
- Attribute casting
Contoh:protected $casts = [ 'is_active' => 'boolean', 'price' => 'integer', ]; - Accessor dan Mutator
- Accessor: mengubah data saat dibaca
- Mutator: mengubah data saat disimpan
- Query Scope
Contoh:public function scopeActive($query) { return $query->where('is_active', true); }
Hal yang Tidak Ideal Ditaruh di Model
Walaupun Model bisa menampung banyak method, ada beberapa hal yang sebaiknya tidak Anda taruh di Model jika aplikasi mulai besar:
- Logika bisnis yang kompleks (misalnya proses checkout lengkap)
- Pemanggilan API eksternal
- Proses panjang seperti import/export file
- Workflow multi-step yang melibatkan banyak tabel sekaligus
Untuk kasus seperti itu, lebih baik menggunakan service class atau action class.
Apa Itu Controller pada Laravel?
Controller adalah class yang bertugas menerima request dari user, memprosesnya, lalu mengembalikan response. Controller menjadi “pintu masuk” logika aplikasi setelah request melewati route dan middleware.
Contoh controller:
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function index()
{
$products = Product::latest()->paginate(10);
return view('products.index', compact('products'));
}
}
Tugas Utama Controller pada Laravel
Controller pada Laravel umumnya bertanggung jawab untuk:
- Menerima request dari route
Controller dipanggil melalui route:Route::get('/products', [ProductController::class, 'index']); - Mengambil input request
Input bisa berupa:- query string
- form data
- JSON body
- file upload
- Memanggil Model atau Service
Controller seharusnya menjadi koordinator, bukan tempat logika bisnis utama. - Mengembalikan response
Response bisa berupa:- View (Blade)
- JSON (API)
- Redirect
- File download
- Response custom
- Mengatur flow aplikasi
Misalnya:- jika validasi gagal → return error
- jika berhasil → redirect ke halaman tertentu
Controller pada Laravel Tidak Sama dengan “Logika Bisnis”
Ini poin yang sering salah kaprah.
Controller memang tempat “logika”, tetapi bukan logika bisnis yang kompleks. Controller idealnya hanya menangani:
- validasi input
- pemanggilan fungsi (model/service)
- mengatur response
Jika Controller Anda berisi 200–400 baris, biasanya itu pertanda struktur Anda perlu dirapikan.
Perbedaan Model dan Controller pada Laravel (Penjelasan Paling Jelas)
Agar mudah, berikut perbedaan inti Model dan Controller dalam Laravel:
1. Model Fokus pada Data

Model bekerja pada level data dan database:
- menyimpan data
- membaca data
- relasi antar data
- aturan format data
Model tidak fokus pada request user.
2. Controller Fokus pada Request dan Response

Controller bekerja pada level aplikasi:
- menerima request
- memvalidasi request
- memanggil Model
- menyiapkan response
Controller tidak bertugas mengatur struktur tabel.
3. Model Bisa Dipakai Banyak Controller
Satu Model bisa dipakai oleh banyak Controller.
Contoh:
Productmodel bisa dipakai oleh:- ProductController
- AdminProductController
- ApiProductController
4. Controller Tidak Boleh Mengulang Query yang Sama Terus

Jika query rumit dipakai berulang, lebih baik pindahkan ke:
- Query scope
- Repository
- Service class
Dengan begitu, Controller tetap bersih.
5. Model Tidak Mengatur Tampilan
Model tidak boleh mengembalikan view, redirect, atau response HTTP.
Model hanya mengelola data.
Contoh Praktik: CRUD Produk (Model vs Controller)
Agar lebih nyata, berikut contoh pembagian tanggung jawab yang benar.
Contoh Model: Product.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'price', 'stock', 'is_active'];
protected $casts = [
'price' => 'integer',
'stock' => 'integer',
'is_active' => 'boolean',
];
public function scopeActive($query)
{
return $query->where('is_active', true);
}
}
Model:
- mengatur field
- mengatur cast
- membuat scope
Contoh Controller: ProductController.php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function store(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:100'],
'price' => ['required', 'integer', 'min:0'],
'stock' => ['required', 'integer', 'min:0'],
]);
Product::create($validated);
return redirect()->route('products.index')
->with('success', 'Produk berhasil ditambahkan.');
}
}
Controller:
- validasi request
- memanggil model
- redirect + flash message
Kapan Logika Harus Dipindah ke Service Class?
Jika aplikasi Anda berkembang, Anda akan menemui kasus seperti:
- Proses checkout
- Perhitungan diskon
- Workflow order + invoice + payment
- Import Excel ribuan baris
- Integrasi API eksternal
Jika semua logika ini dimasukkan ke Controller, Controller akan menjadi sulit dirawat.
Di Laravel, best practice adalah menggunakan:
- Service class
- Action class
- Job (queue)
- Event
Contoh Service Class Singkat
Misalnya proses “checkout”:
class CheckoutService
{
public function checkout(User $user, array $payload)
{
// validasi bisnis
// hitung total
// simpan order
// simpan detail
// kurangi stok
// buat invoice
// return hasil
}
}
Lalu Controller hanya memanggil service.
Kesalahan Umum Pemula Laravel tentang Model dan Controller
Berikut kesalahan yang paling sering terjadi:
1) Semua Query Ditulis di Controller
Ini membuat Controller penuh query dan sulit dibaca.
Solusi:
- gunakan model scope
- gunakan repository
- gunakan service layer
2) Model Berisi Semua Logika Bisnis
Model akhirnya memiliki puluhan method yang mencampur:
- query database
- logic perhitungan
- API call
- file upload
Solusi:
Pisahkan logika bisnis ke service.
3) Controller Terlalu Gemuk (Fat Controller)
Controller seharusnya ringan, tetapi pemula sering menulis semua proses di Controller.
Solusi:
Gunakan:
- Form Request
- Service class
- Job queue
4) Model Mengatur Response HTTP
Contoh yang salah:
return redirect()->back();
Model tidak boleh mengembalikan response HTTP.
Kesimpulan

Model dan Controller pada Laravel adalah dua komponen berbeda dalam arsitektur MVC yang memiliki peran masing-masing.
Model bertanggung jawab terhadap data dan database, termasuk relasi, query, dan aturan data. Controller bertanggung jawab terhadap alur aplikasi: menerima request, memvalidasi input, memanggil model atau service, dan mengembalikan response.
Memahami perbedaan ini bukan hanya soal teori, tetapi akan menentukan kualitas struktur proyek Laravel Anda. Dengan pembagian tanggung jawab yang benar, aplikasi akan lebih mudah dikembangkan, lebih mudah diuji, dan jauh lebih rapi ketika skalanya semakin besar.



