Mengatasi 'Target class controller does not exist' di Laravel 8

whynwd

whynwd Selasa, 17 November 2020

Cara Mengatasi "Target class [controller] does not exist" di Laravel 8

Ada pembaharuan di laravel 8 dalam kita mendefinisikan rute, seperti yang tertulis di dokumentasi rilis laravel 8 mengenai Routing Namespace Update. Bahwa pada versi ini cara penulisan menggunakan sintaks callable PHP; meskipun tetap bisa menggunakan cara seperti versi sebelumnya.

Yang membedakan dari versi sebelumnya dan bagaimana kita bisa mendefisinikan route seperti yang kita lakukan di versi sebelumnya yaitu di laravel 8 tidak mendefinisikan namespace route ke kontroller secara otomatis. Oleh karena itu kita mendapati kesalah atau error seperti Target class [xxxcontroller] does not exist.

Sebagai contoh:

//api.php
Route::post('login', 'UserController@login');
@blog ➜ php artisan route:list

Illuminate\Contracts\Container\BindingResolutionException

Target class [UserController] does not exist.

at D:\development\laravel\lacommerce\vendor\laravel\framework\src\Illuminate\Container\Container.php:811
    807▕
    808▕         try {
    809▕             $reflector = new ReflectionClass($concrete);
    810▕         } catch (ReflectionException $e) {
 ➜ 811▕             throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
    812▕         }
    813▕
    814▕         // If the type is not instantiable, the developer is attempting to resolve
    815▕         // an abstract type such as an Interface or Abstract Class and there is

  1   [internal]:0
      Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console\{closure}(Object(Illuminate\Routing\Route))

  2   D:\development\laravel\lacommerce\vendor\laravel\framework\src\Illuminate\Container\Container.php:809
      ReflectionException::("Class UserController does not exist")

Kesalahan / error tersebut terjadi karena tidak ditemukannya lokasi atau path dari kontroller yang kita defisinikan pada route.

Cara Mengatasi

Sekarang mari kita lihat bagaimana cara mengatasi error tersebut. Ada beberapa cara yang bisa kita terapkan.

Cara pertama yang bisa kita terapkan adalah action sintaks dengan menambahkan class kontroller, seperti dibawah ini.

//api.php
<?php

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

#atau

Route::get('/users', [App\Http\Controllers\UserController::class, 'index']);

Mungkin cara diatas akan terlalu panjang jika kita memiliki banyak route karena mengimport setiap class kontroller, tapi itu yang disarankan di laravel 8. Namun kita bisa memilih untuk menggunakan cara lainnya, yaitu dengan menambahkan namespace route.

Seperti yang disinggung sebelumnya diatas, bahwa dilaravel 8 namespace route tidak disediakan secara otomatis dan kita perlu menambahkannnya jika ingin seperti versi sebelumnya.

Silahkan buka RouteServiceProvider.php dan tambahkan properti $namespace seperti dibawah ini.

protected $namespace = 'App\\Http\\Controllers';


public function boot()
{
  $this->configureRateLimiting();

  $this->routes(function () {
    Route::prefix('api')
     ->middleware('api')
     ->namespace($this->namespace)
     ->group(base_path('routes/api.php'));

   Route::middleware('web')
     ->namespace($this->namespace)
     ->group(base_path('routes/web.php'));
  });
}

Setelah properti $namespace di tambahkan, kita kita bisa membuat route dengan format seperti sebelumnya. Contohnya seperti dibawah ini.

<?php
 
Route::get('/users', 'UserController@index');

Atau cara lain kita bisa juga dengan menambahkan path atau namespace pada action route seperti dibawah ini.

//api.php
<?php

Route::get('/users', '\App\Http\Controllers\UserController@index');

Setelah menggunakan salah satu cara diatas, kita bisa mengatasi error tersebut.

@blog ➜ php artisan route:list
+--------+----------+-----------+------+-------------------------------------------+------------+
| Domain | Method   | URI       | Name | Action                                    | Middleware |
+--------+----------+-----------+------+-------------------------------------------+------------+
|        | GET|HEAD | /         |      | Closure                                   | web        |
|        | GET|HEAD | api/users |      | App\Http\Controllers\UserController@index | api        |
+--------+----------+-----------+------+-------------------------------------------+------------+

Silahkan dicoba.

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel