Memahami Konsep dan Cara Kerja Controller Laravel 10 Terbaru 2023 #6

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:

  1. Pemisahan Tugas: Controller memungkinkan pemisahan tugas berdasarkan fungsionalitas. Sebagai contoh, kita dapat memiliki controller khusus untuk pengguna, satu untuk posting, dan seterusnya.
  2. 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.
  3. 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:

  1. Pengguna mengirimkan permintaan ke aplikasi Laravel. Permintaan tersebut dapat berasal dari URL, form, atau API.
  2. Laravel akan merutekan permintaan tersebut ke controller yang sesuai. Routing adalah proses yang menghubungkan URL dengan controller.
  3. Controller akan menerima permintaan dari Laravel.
  4. 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
  5. Controller akan menghasilkan respons. Respons dapat berupa halaman web, data JSON, atau teks.
  6. 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

Bash
php artisan make:controller UserController
Bash

Setelah membuatnya, Anda dapat melihat contoh controller yang baru dibuat yang berada pada folder app/Http/Controllers/ShopController seperti berikut:

PHP
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ShopController extends Controller
{
    //
}
app/Http/Controllers/ShopController

Sebuah 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
<?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/ShopController

Pada 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:

PHP
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.php

Apabila 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
<?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/ShopController

Isi 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:

PHP
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.php

Pada 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.

controller laravel

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
<?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/ShopController

Setelah menulis class dan method controller, Sekarang anda dapat mendefinisikan route ke method controller tersebut seperti ini:

PHP
Route::get('shops', [ShopController::class,'index'])->name('shops.index');
routes/web.php

Ketika 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

Laravel

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
<?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/ShopController

Pada 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:

Bash
php artisan make:controller ProductController --invokable
Bash

Perintahnya 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:

PHP
Route::get('shops', ShopController::class)->name('shops.index');
PHP

Pada 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.

Laravel

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.

PHP
namespace App\Http\Controllers;
PHP

Extends Controller

Secara konsisten, pastikan setiap controller Anda meng-extend kelas dasar Controller dari Laravel.

PHP
use App\Http\Controllers\Controller;

class ShopController extends Controller
{
    // ...
}
PHP

Metode 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.

PHP
public function index(): View
{
    return view('shops.index');
}
PHP

Parameter Route

Gunakan tipe data yang sesuai untuk parameter rute. Jika parameter memiliki tipe data tertentu, tentukan itu untuk meningkatkan kejelasan dan keamanan kode.

PHP
    public function sum(int $num1, int $num2): int
    {
        return $num1 + $num2;
    }
PHP

Dengan 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

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *