Laravel Tips - Mengatasi Error Laravel 10 Return value must be of type Illuminate\Http\Response, none returned

Hello Gaes, Salah satu hal baru yang dikenalkan di Laravel 10 adalah penggunaan native PHP type declarations.

Membuat Controller di Laravel 10

Sebagai contoh, ketika kita membuat sebuah controller di Laravel 10 dengan perintah berikut:

php artisan make:controller ProductController -r

Maka hasil kode program yang di hasilkan (app/Http/Controllers/ProductController.php) adalah seperti berikut:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class ProductController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index(): Response
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create(): Response
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request): RedirectResponse
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id): Response
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id): Response
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id): RedirectResponse
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id): RedirectResponse
    {
        //
    }
}

Membuat Route di Laravel 10

Kemudian, kita tambahkan tambahkan routenya (routes/web.php) sehingga menjadi seperti berikut:

<?php

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\ProductController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});


Route::get('products', [ProductController::class, 'index'])->name('products.index');
Route::get('products/create', [ProductController::class, 'create'])->name('products.create');
Route::post('products', [ProductController::class, 'store'])->name('products.store');
Route::get('products/{id}/edit', [ProductController::class, 'edit'])->name('products.edit');
Route::put('products/{id}', [ProductController::class, 'update'])->name('products.update');
Route::delete('products/{id}', [ProductController::class, 'destroy'])->name('products.destroy');

Terjadi Error : Return value must be of type Illuminate\Http\Response, none returned

Setelah kita jalankan projectnya dengan perintah php artisan serve kemudian kita akses di browser http://localhost:8000/products terjadi error Return value must be of type Illuminate\Http\Response, none returned, yang mana ini tidak terjadi di Laravel versi sebelumnya.

Error ini terjadi karena kita tidak memberikan response yang kompatibel dengan object Response pada method index di ProductController tersebut.

Mengatasi Error Return value must be of type Illuminate\Http\Response, none returned di Laravel 10

Cara mengatasi error tersebut adalah:

Ketika Ingin Membuat Rest API

Ketika ingin response dari http://localhost:8000/products adalah berupa JSON, maka kita dapat mengubah kode program pada method index menjadi seperti berikut:

public function index(): Response
    {
        return response(['foo' => 'bar']);
    }

Kemudian kita akses menggunakan browser maka akan tampil JSON seperti berikut:

Ketika Ingin Menampilkan Blade View

Sedangkan jika kita ingin response tersebut adalah berupa halaman web maka kita ubah kode programnya menjadi seperti berikut:

public function index(): Response
    {
        return response(view('products.index'));
    }

Tentu saja, kita perlu buat file blade dengan nama index.blade.php pada folder resources/views/products. Misalnya aja kita isi file blade tersebut dengan konten seperti berikut:

<h3>Products Page</h3>
<p>Ini adalah halaman list produk</p>

Kemudian kita akses menggunakan browser maka tampilannnya akan seperti berikut:

Selamat mencoba!

Tulis Komentar