Apakah Anda ingin membuat aplikasi Laravel yang terstruktur, reusable, dan testable? Jika iya, maka Anda perlu memahami cara kerja controller laravel. Laravel, sebagai salah satu framework PHP paling populer, menawarkan berbagai fitur yang mempermudah pengembangan aplikasi web. Salah satu konsep yang penting dalam Laravel adalah penggunaan controller untuk mengelola logika penanganan permintaan HTTP. Dalam artikel ini, kita akan membahas tentang apa controller dalam konteks Laravel dan bagaimana mengorganisir logika penanganan permintaan dengan lebih efisien menggunakan controller.
Apa Itu Controller Laravel
Controller dalam Laravel adalah kelas PHP yang mengelompokkan logika penanganan permintaan terkait ke dalam satu tempat. Dengan menggunakan controller, kita dapat memisahkan logika aplikasi menjadi unit yang lebih terkelola. Sebagai contoh, kita dapat memiliki controller khusus untuk menangani operasi terkait pengguna, seperti menampilkan, membuat, memperbarui, dan menghapus pengguna. Dengan memisahkan logika ini, kita dapat membuat kode lebih terstruktur dan mudah dipelihara.
Mengapa Kita Perlu Controller
Daripada menempatkan semua logika penanganan permintaan di dalam file rute, Laravel merekomendasikan penggunaan controller untuk mengatur perilaku tersebut. Ini memberikan beberapa keuntungan:
- Pemisahan Tugas: Controller memungkinkan pemisahan tugas berdasarkan fungsionalitas. Sebagai contoh, kita dapat memiliki controller khusus untuk pengguna, satu untuk posting, dan seterusnya.
- Struktur Kode yang Lebih Baik: Dengan menggunakan controller, kita dapat mengorganisir kode dengan lebih baik. Setiap controller dapat fokus pada tugas tertentu, membuat kode lebih mudah dipahami dan diikuti.
- Mempermudah Pemeliharaan: Dengan memisahkan logika ke dalam controller, pemeliharaan kode menjadi lebih mudah. Jika kita perlu mengubah perilaku terkait pengguna, kita hanya perlu membuka controller UserController tanpa harus mencari-cari di file rute atau berkas lainnya.
Cara Kerja Controller
Controller bekerja dengan cara memproses permintaan dari pengguna. Permintaan tersebut dapat berasal dari URL, form, atau API. Saat pengguna mengirimkan permintaan, Laravel akan merutekan permintaan tersebut ke controller yang sesuai. Controller kemudian akan memproses permintaan tersebut dan menghasilkan respons. Proses kerja controller secara lebih detail dapat dijelaskan sebagai berikut:
- Pengguna mengirimkan permintaan ke aplikasi Laravel. Permintaan tersebut dapat berasal dari URL, form, atau API.
- Laravel akan merutekan permintaan tersebut ke controller yang sesuai. Routing adalah proses yang menghubungkan URL dengan controller.
- Controller akan menerima permintaan dari Laravel.
- Controller akan memproses permintaan tersebut. Proses pemrosesan permintaan dapat melibatkan berbagai aktivitas, seperti:
- Melakukan operasi CRUD pada database
- Mengirim email
- Mengirim notifikasi
- Dan lain-lain
- Controller akan menghasilkan respons. Respons dapat berupa halaman web, data JSON, atau teks.
- Laravel akan mengirimkan respons ke pengguna.
Basic Controller
Untuk membuat controller baru di Laravel anda dapat menggunakan perintah Artisan make:controller pada terminal anda. Anda dapat membuat projek laravel baru atau menggunakan projek laravel sebelumnya. Secara default, controller yang dibuat disimpan pada folder app/Http/Controllers. Berikut merupakan contoh perintah untuk membuat controller ‘ShopController‘
php artisan make:controller UserController
BashSetelah membuatnya, Anda dapat melihat contoh controller yang baru dibuat yang berada pada folder app/Http/Controllers/ShopController seperti berikut:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ShopController extends Controller
{
//
}
app/Http/Controllers/ShopControllerSebuah controller pada dasarnya terdiri dari berbagai method tergantung dari fungsi nya. Dalam method inilah kita dapat melaksanakan berbagai tugas, seperti menampilkan teks secara langsung dengan menggunakan pernyataan return, mengembalikan view, atau mengembalikan json response dan masih banyak lain nya. Mari kita coba untuk membuat beberapa method.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ShopController extends Controller
{
public function calculator(): string
{
return "Kalkulator sederhana untuk menghitung produk";
}
public function sum(): string
{
return "Ini penjumlahan";
}
public function sub(): string
{
return "Ini pengurangan";
}
}
app/Http/Controllers/ShopControllerPada controller tersebut kita membuat 3 method yang berbeda dengan mengembalikan masing-masing string. Kemudian kita panggil controller dan method tersebut di dalam route seperti berikut:
Route::get('shops/calculator', [ShopController::class,'calculator'])>name('shops.calculator');
Route::get('shops/sum', [ShopController::class,'sum'])->name('shops.sum');
Route::get('shops/sub', [ShopController::class,'sub'])->name('shops.sub');
routes/web.phpApabila anda membuka di browser untuk masing-masing route maka akan menampilkan masing-masing return yang sama pada method yang telah anda buat. Kemudian kita akan coba membuat method tersebut menggunakan parameter dan kita pun bisa memanggil method pada method yang lain nya seperti berikut:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ShopController extends Controller
{
public function calculator(): string
{
$resultSum = $this->sum(5, 10);
$resultSub = $this->sub(5, 10);
return "Hasil penjumlahan $resultSum dan pengurangan $resultSub";
}
public function sum(int $num1, int $num2): int
{
return $num1 + $num2;
}
public function sub(int $num1, int $num2): int
{
return $num1 - $num2;
}
}
app/Http/Controllers/ShopControllerIsi dari method calcalutor tersebut memanggil 2 method yaitu method sum dan method sub, untuk memanggil method di class yang sama anda dapat menggunakan kata kunci $this, kemudian untuk method sum dan sub ada beberapa perubahan yaitu ada tambahan 2 parameter yang berarti kita juga harus memperbarui route menjadi seperti berikut:
Route::get('shops/calculator', [ShopController::class,'calculator'])->name('shops.calculator');
Route::get('shops/sum/{num1}/{num2}', [ShopController::class,'sum'])->name('shops.sum');
Route::get('shops/sub/{num1}/{num2}', [ShopController::class,'sub'])->name('shops.sub');
routes/web.phpPada route shops.sum dan shops.sub ada penambahan 2 parameter, apabila anda mengakses di browser maka url nya menjadi seperti ini http://127.0.0.1:8000/shops/sum/1/2 dan akan mengembalikan hasil penjumlahan tersebut.
Materi route parameter sudah di bahas pada materi route. Jika anda lupa anda bisa membaca nya kembali disini.
Apakah anda masih ingat pada materi Blade Laravel untuk Pemula , pada materi tersebut kita belajar cara menggunakan route laravel dan saya memberikan contoh kepada anda mengirim data dari route ke view. Untuk saat ini mari kita pindahkan kode tersebut kita akan mengirim data ke view melalui controller seperti berikut:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ShopController extends Controller
{
public function index(): View
{
$title = 'Shops';
$description = 'Silahkan pilih produk yang anda inginkan';
$products = [
'product_1' => [
'name' => 'Product 1',
'price' => 100,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Electronics',
'stock' => 10,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_2' => [
'name' => 'Product 2',
'price' => 300,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Furniture',
'stock' => 25,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_3' => [
'name' => 'Product 3',
'price' => 500,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Clothes',
'stock' => 5,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_4' => [
'name' => 'Product 4',
'price' => 700,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Electronics',
'stock' => 0,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_5' => [
'name' => 'Product 5',
'price' => 900,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Furniture',
'stock' => 15,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_6' => [
'name' => 'Product 6',
'price' => 1100,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Clothes',
'stock' => 30,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_7' => [
'name' => 'Product 7',
'price' => 1300,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Electronics',
'stock' => 20,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_8' => [
'name' => 'Product 8',
'price' => 1500,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Furniture',
'stock' => 10,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_9' => [
'name' => 'Product 9',
'price' => 1700,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Clothes',
'stock' => 0,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
]
];
return view('shops.index',[
'title' => $title,
'description' => $description,
'products' => $products
]);
}
}
app/Http/Controllers/ShopControllerSetelah menulis class dan method controller, Sekarang anda dapat mendefinisikan route ke method controller tersebut seperti ini:
Route::get('shops', [ShopController::class,'index'])->name('shops.index');
routes/web.phpKetika permintaan masuk cocok dengan URI rute yang ditentukan, metode index dalam kelas app\Http\Controllers\ShopController akan dipanggil. Mari kita buka di browser seharusnya jika tidak ada masalah tampilan nya seperti berikut
Single Action Controller
Jika method controller cukup kompleks, Anda mungkin menemukan nyaman untuk menetapkan seluruh class controller untuk satu aksi tertentu. Untuk melakukan ini, Anda dapat menentukan satu metode __invoke
dalam controller. Pada contoh sebelumnya di dalam controller ShopController kita hanya memiliki 1 method akan lebih baik controller tersebut dibuat menjadi invokable atau single action controller. Caranya seperti berikut:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ShopController extends Controller
{
public function __invoke(): View
{
$title = 'Shops';
$description = 'Silahkan pilih produk yang anda inginkan';
$products = [
'product_1' => [
'name' => 'Product 1',
'price' => 100,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Electronics',
'stock' => 10,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_2' => [
'name' => 'Product 2',
'price' => 300,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Furniture',
'stock' => 25,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_3' => [
'name' => 'Product 3',
'price' => 500,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Clothes',
'stock' => 5,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_4' => [
'name' => 'Product 4',
'price' => 700,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Electronics',
'stock' => 0,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_5' => [
'name' => 'Product 5',
'price' => 900,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Furniture',
'stock' => 15,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_6' => [
'name' => 'Product 6',
'price' => 1100,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Clothes',
'stock' => 30,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_7' => [
'name' => 'Product 7',
'price' => 1300,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Electronics',
'stock' => 20,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_8' => [
'name' => 'Product 8',
'price' => 1500,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Furniture',
'stock' => 10,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
],
'product_9' => [
'name' => 'Product 9',
'price' => 1700,
'description' => 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, voluptatum.',
'category' => 'Clothes',
'stock' => 0,
'image' => 'https://placehold.co/400/1F2937/FFFFFF/?text=No+Image+Available'
]
];
return view('shops.index',[
'title' => $title,
'description' => $description,
'products' => $products
]);
}
}
app/Http/Controllers/ShopControllerPada controller tersebut tidak banyak yang berubah, untuk membuatnya menjadi single action controller kita ubah nama method nya nya menjadi __invoke(). Kemudian jika anda ingin langsung membuat controller baru dengan single action controller anda dapat memasukkan perintah ini di terminal anda:
php artisan make:controller ProductController --invokable
BashPerintahnya sama seperti anda membuat controller namun diakhir terdapat tambahan –invokable yang berfungsi untuk membuat controller tersebut menjadi single action controller. Sebagai infrormasi apabila anda sudah menetapkan controller tersebut menjadi single action controller, pada controller tersebut anda tidak dapat menambahkan method baru. Kemudian kita perlu memperbarui kode route seperti berikut:
Route::get('shops', ShopController::class)->name('shops.index');
PHPPada route tersebut kita tidak perlu memanggil method yang digunakan karena ShopController merupakan single action controller jadi kita bisa langsung memanggil class controller nya. Kemudian kita coba untuk mengaksesnya kembali di browser.
Aturan Penulisan Controller
Penggunaan controller sangat penting untuk mengelola logika bisnis dan merespons permintaan HTTP. Agar konsisten dan mudah dipahami, berikut adalah beberapa aturan penulisan controller dalam Laravel.
Nama Controller
Pastikan nama controller mencerminkan tujuan dan fungsionalitasnya. Gunakan format CamelCase dan akhiri dengan kata “Controller”. Contoh: ShopController.
Namespace
Gunakan namespace yang sesuai dengan struktur direktori aplikasi Anda. Biasanya, controller ditempatkan di dalam direktori app\Http\Controllers. Pastikan untuk merefleksikan struktur namespace tersebut di dalam controller.
namespace App\Http\Controllers;
PHPExtends Controller
Secara konsisten, pastikan setiap controller Anda meng-extend kelas dasar Controller dari Laravel.
use App\Http\Controllers\Controller;
class ShopController extends Controller
{
// ...
}
PHPMetode Responsif
Setiap metode dalam controller harus mereturn respons yang jelas. Gunakan metode return dengan tipe data yang sesuai seperti string, view, json, atau redirect. Ini membantu pemahaman dan dokumentasi kode.
public function index(): View
{
return view('shops.index');
}
PHPParameter Route
Gunakan tipe data yang sesuai untuk parameter rute. Jika parameter memiliki tipe data tertentu, tentukan itu untuk meningkatkan kejelasan dan keamanan kode.
public function sum(int $num1, int $num2): int
{
return $num1 + $num2;
}
PHPDengan mengikuti aturan penulisan controller yang konsisten, Anda dapat meningkatkan kejelasan, pemeliharaan, dan kolaborasi tim dalam pengembangan aplikasi Laravel Anda. Pastikan untuk mengikuti praktik terbaik ini untuk membangun kode yang bersih dan efisien.
Terimakasih, semoga materi Memahami Konsep dan Cara Kerja Controller Laravel dapat bermanfaat untuk kalian semua