Target Class Does Not Exist di Laravel: Penyebab dan Solusi

Error Target class [SomethingController] does not exist. muncul saat Laravel mencoba me-resolve controller, middleware, atau service dari service container, tetapi class yang diminta tidak ditemukan atau tidak bisa di-load.

Sekilas error ini mirip dengan Class not found, tetapi konteksnya lebih spesifik: Laravel sedang mencari target untuk route, binding, alias middleware, atau dependency injection. Jadi sumber masalahnya sering ada di konfigurasi route atau container, bukan hanya di isi class.

Jawaban Singkat

Kalau error ini muncul, biasanya masalahnya salah satu dari tiga hal:

  1. route memanggil nama controller yang salah,
  2. alias middleware belum didaftarkan,
  3. namespace atau import class tidak cocok.

Mulai dari pemanggilnya dulu, bukan dari isi class.

Kapan Error Ini Biasanya Muncul?

  • Saat menulis route ke controller baru
  • Saat mendaftarkan middleware alias yang salah
  • Saat binding service di AppServiceProvider
  • Setelah rename namespace atau folder controller
  • Setelah upgrade Laravel dan masih memakai pola route lama

Penyebab Paling Umum

1. Controller Tidak Di-import dengan Benar

<?php

use App\Http\Controllers\PostController;

Route::get('/posts', [PostsController::class, 'index']);

Class yang di-import PostController, tetapi route memanggil PostsController.

Karena typo satu huruf, Laravel mencoba mencari class yang memang tidak ada.

2. Masih Memakai String Controller Lama

<?php

Route::get('/laporan', 'LaporanController@index');

Pada struktur project modern Laravel, lebih aman memakai class constant agar editor dan autoload ikut membantu.

Selain lebih rapi, cara ini juga lebih mudah dideteksi saat refactor.

3. Alias Middleware Tidak Terdaftar

Route::get('/admin', AdminController::class)
    ->middleware('admins');

Kalau alias yang terdaftar adalah admin, Laravel akan mencoba mencari target yang tidak ada.

4. File Ada, Tapi Namespace Salah

<?php

namespace App\Http\Controllers\AdminPanel;

class AdminController extends Controller
{
}

Kalau route masih mengarah ke App\Http\Controllers\Admin, target yang diminta tetap dianggap tidak ada.

5. Namespace atau Lokasi File Berubah

File controller dipindah ke subfolder Admin, tetapi route masih menunjuk lokasi lama.

6. Cache Route atau Container Masih Stale

Setelah perubahan struktur besar, route cache atau autoload lama bisa membuat Laravel tetap mencari class di path sebelumnya.

Langkah Diagnosis

  1. Salin nama target class dari pesan error persis seperti aslinya.
  2. Cari route, alias middleware, atau binding yang memanggil class itu.
  3. Pastikan class benar-benar ada di path yang sesuai.
  4. Cocokkan namespace, nama file, dan use statement.
  5. Kalau semuanya terlihat benar, bersihkan cache dan perbarui autoload.
Mulai dari Tempat Laravel Memanggilnya

Pesan Target class does not exist biasanya muncul karena route, middleware, atau binding memanggil nama class yang salah. Jadi cek pemanggilnya dulu, baru isi class-nya.

Langkah Fix

1. Pakai Class Constant di Route

<?php

use App\Http\Controllers\LaporanController;

Route::get('/laporan', [LaporanController::class, 'index']);

Ini lebih aman daripada string manual karena IDE dan PHP akan membantu mendeteksi typo.

2. Perbaiki Import dan Namespace

<?php

namespace App\Http\Controllers\Admin;

class LaporanController extends Controller
{
}

Kalau controller ada di app/Http/Controllers/Admin/LaporanController.php, route juga harus mengacu ke namespace itu.

3. Cek Alias Middleware

<?php

$middleware->alias([
    'admin' => \App\Http\Middleware\CekAdmin::class,
]);

Pastikan nama alias yang dipakai di route sama persis dengan yang didaftarkan.

4. Perbarui Autoload dan Bersihkan Cache

composer dump-autoload
php artisan optimize:clear

5. Cek Binding Manual di Container

Kalau kamu memakai binding seperti ini:

<?php

$this->app->bind(ReportService::class, ReportService::class);

pastikan ReportService memang ada, namespace-nya benar, dan file-nya sesuai standar PSR-4.

Contoh Sebelum dan Sesudah

Sebelum

<?php

Route::get('/produk', [Produkcontroller::class, 'index']);

Kalau class yang benar adalah ProdukController, Laravel akan gagal me-resolve target controller.

Sesudah

<?php

use App\Http\Controllers\ProdukController;

Route::get('/produk', [ProdukController::class, 'index']);

Kesalahan yang Sering Terjadi

Route Baru Selalu Error, Padahal File Controller Sudah Ada

Biasanya use statement salah, nama class berbeda huruf besar-kecil, atau route masih menunjuk ke nama lama.

Middleware Alias Tidak Dikenali

Periksa apakah alias middleware sudah didaftarkan dan apakah route memakai nama alias yang benar.

Error Muncul Setelah Rename Folder

Biasanya route cache, autoload Composer, atau import class belum ikut diperbarui.

Middleware Sudah Dibuat, Tapi Belum Didaftarkan

Laravel 11+ tetap butuh alias middleware yang benar di bootstrap/app.php. File class saja tidak cukup.

Pencegahan

  1. Gunakan php artisan make:controller dan generator resmi Laravel.
  2. Hindari string controller kalau tidak ada alasan kuat.
  3. Saat memindahkan file, segera cek semua route, binding, dan middleware yang bergantung padanya.
  4. Jaga konsistensi nama file dan namespace sesuai PSR-4.
  5. Setelah refactor struktur, jalankan composer dump-autoload dan php artisan optimize:clear.

Bacaan Terkait

FAQ

Apa bedanya Target class does not exist dengan Class not found?

Class not found lebih umum. Target class does not exist biasanya muncul saat Laravel container sedang mencoba me-resolve controller, middleware, atau dependency tertentu.

Apakah php artisan route:clear perlu dijalankan?

Kalau kamu pernah memakai route cache atau baru mengubah struktur route/controller, itu sering membantu. php artisan optimize:clear biasanya sudah mencakup kebutuhan ini.

Kenapa error ini sering muncul setelah copy-paste route?

Karena nama controller atau namespace lama sering ikut terbawa dan tidak ikut diganti semuanya.