Controller
Dokumentasi dan Tutorial Laravel 9.x Bahasa Indonesia; Diperbarui tanggal: 9/09/2025# Controller
#Pendahuluan
Controller merupakan suatu bagian penting dari pemrograman MVC yang berfungsi sebagai penghubung antara View dan model. Didalam controller akan terdapat banyak logika-logika pemrograman untuk menyusun fungsi tertentu. Berbagai pemprosesan juga pada umumnya dilakukan didalam controller. Sebagai contoh UserController class merupakan sebuah controller yang bertugas menangani semua perintah yang berhubungan dengan pengguna dari mulai menampilkan, menambahkan, mengupdate, dan menghapus. Secara bawaan file controller akan disimpan pada folder app/Http/Controllers.
#Membuat Controller
# Membuat Controller
Setiap membuat controller yang pertama dilakukan yaitu kita harus mendefinisikan lokasi file controller dimana kita simpan. Sebagai contoh kita menyimpan file controller pada folder app/Http/Controllers maka kita harus mengawali kode dengan namespace App\Http\Controllers. Selanjutnya kita juga harus memasukkan kelas dasar controller yaitu App\Http\Controllers\Controller yang merujuk pada file didadalm folder app/Http/Controllers/Controller.php. Sebagai contoh:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class UserController extends Controller
{
/**
* Show the profile for a given user.
*
* @param int $id
* @return \Illuminate\View\View
*/
public function show($id)
{
return view('user.profile', [
'user' => User::findOrFail($id)
]);
}
}
Selanjutnya kita dapat mendefinisikan controller diatas pada route.
use App\Http\Controllers\UserController;
Route::get('/user/{id}', [UserController::class, 'show']);
Perintah diatas menggambarkan bahwa ketika user mengakses url dengan alamat /user/id_user maka method show pada kelas App\Http\Controllers\UserController akan dipanggil dan selanjutnya mengirimkan data user ke view yang merujuk pada file resources/views/user/profile.blade.php untuk ditampilkan kepada user.
# Single Action Controllers/ Controller aksi tunggal
Adakalanya dalam sebuah pemrograman terdapat sebuah prosedur yang komplek dan rumit. Untuk prosedur yang kompleks dan rumit tersebut sebaiknya dibuat dalam controller tunggal menggunakan metode __invoke
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
class ProvisionServer extends Controller
{
/**
* Provision a new web server.
*
* @return \Illuminate\Http\Response
*/
public function __invoke()
{
// ...
}
}
Selanjutnya kita dapat meregistrasikan controller tersebut pada route
use App\Http\Controllers\ProvisionServer;
Route::post('/server', ProvisionServer::class);
Untuk membuat controller tunggal kita dapat membuatnya secara manual atau melalui php artisan
php artisan make:controller ProvisionServer --invokable
# Controller Middleware
Minddleware selain dapat ditautkan pada route juga dapat dihubungkan secara langsung ke controller. Ini dilakukan biasanya jika middleware tersebut hanya berlaku khusus pada controller tertentu. Sebagai contoh:
class UserController extends Controller
{
/**
* Instantiate a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('log')->only('index');
$this->middleware('subscribed')->except('store');
}
}
Middleware pertama $this->middleware('auth') menunjukkan bahwa controller atau web hanya bisa diakses jika pengguna telah login. Kemudian midleware $this->middleware('log')->only('index') menunjukkan bawah laravel akan menuliskan log jika pengguna mengakses metode index. Dan $this->middleware('subscribed')->except('store') berlaku kesemua metode kecuali metode store.
# Resource Controllers
Jika kita ingin membuat sebuah controller yang didalamnya terdapat beberapa metode yang menangani CURD (Create, Update, Read, Delete), maka kita dapat membuatnya melalui php artisan dengan menambahkan opsi --resource. Sebagai contoh kita ingin membuat controller untuk memasukkan riwayat kerja pegawai yang didalamnya terdapat fitur untuk input, update, hapus dan lihat, maka kita dapat melakukannya dengan perintah berikut:
php artisan make:controller RiwayatkerjaController --resource
Perintah diatas akan menghasilkan controller dengan folder app/Http/Controllers/RiwayatkerjaController.php dimana pada controller tersebut telah tersedia metode index, create, store, show, edit, update dan destroy. Selanjutnya kita dapat mendaftarkan controller tersebut pada Route dengan menggunakan metode resource.
use App\Http\Controllers\RiwayatkerjaController;
Route::resource('riwayatkerja', RiwayatkerjaController::class);
Secara otomatis route diatas akan memiliki aksi ke controller sebagai berikut:
Metode | URI | Action | Nama Route | Keterangan |
GET | /riwayatkerja | index | riwayatkerja.index | Digunakan untuk menampilkan daftar riwayat kerja |
GET | /riwayatkerja/create | create | riwayatkerja.create | Digunakan untuk menampilkan form input riwayat kerja |
POST | /riwayatkerja | store | riwayatkerja.store | Digunakan untuk menyimpan riwayat kerja |
GET | /riwayatkerja/{id} | show | riwayatkerja.show | Digunakan untuk menampilkan detil riwayat kerja |
GET | /riwayatkerja/{id}/edit | edit | riwayatkerja.edit | Digunakan untuk membuat form edit riwayat kerja |
PUT/PATCH | /riwayatkerja/{id} | update | riwayatkerja.update | Digunakan untuk menyimpan data update riwayat kerja |
DELETE | /riwayatkerja/{id} | destroy | riwayatkerja.destroy | Digunakan untuk menghapus data |
# Nested Resources
Nested resources merupakan salah satu metode dalam membuat sub resources pada saat penjaluran dengan mudah. Sebagai contoh misalnya kita ingin membuat penjaluran yang menangani semua pengelolaan komentar dari sebuah artikel maka kita dapat menggunakan metode berikut.
use App\Http\Controllers\ArticleCommentController;
Route::resource('article.comments', ArticleCommentController::class);
Penjaluran diatas akan didefinisikan sebagai berikut.
Verb | URI | Action | Route Name |
---|---|---|---|
GET | /article/{photo}/comments |
index | article.comments.index |
GET | /article/{photo}/comments/create |
create | article.comments.create |
POST | /article/{photo}/comments |
store | article.comments.store |
GET | /article/{photo}/comments/{comment} |
show | article.comments.show |
GET | /article/{photo}/comments/{comment}/edit |
edit | article.comments.edit |
PUT/PATCH | /article/{photo}/comments/{comment} |
update | article.comments.update |
DELETE | /article/{photo}/comments/{comment} |
destroy | article.comments.destroy |
# Naming Resource Controllers / Penamaan Resource Controllers
Secara bawaan setiap resource controller pada penjaluran memiliki penamaan yang unik, namun kita masih tetap bisa untuk mengubah penamaan tersebut dengan cara menambahkan atribut names pada nama router yang diinginkan.
use App\Http\Controllers\PhotoController;
Route::resource('article', PhotoController::class)->names([
'create' => 'article.build'
]);