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.