Error "El controlador de clase de destino no existe" al usar Laravel 8
Aquí está mi controlador:
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class RegisterController extends Controller
{
public function register(Request $request)
{
dd('aa');
}
}
Como se ve en la captura de pantalla, la clase existe y está en el lugar correcto:
Mi api.php
ruta:
Route::get('register', 'Api\RegisterController@register');
Cuando llegué a mi register
ruta usando Postman , me dio el siguiente error:
La clase de destino [Api\RegisterController] no existe.
¿Cómo puedo arreglarlo?
Gracias a las respuestas pude solucionarlo. Decidí usar el nombre de clase completo para esta ruta, pero hay otras opciones como se describe en las respuestas.
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
Está utilizando Laravel 8. En una instalación nueva de Laravel 8, no se aplica ningún prefijo de espacio de nombres a los grupos de rutas en los que se cargan sus rutas.
"En versiones anteriores de Laravel, contenía
RouteServiceProvider
una$namespace
propiedad. El valor de esta propiedad se antepondría automáticamente a las definiciones de ruta del controlador y a las llamadas al métodoaction
/ayudanteURL::action
. En Laravel 8.x, esta propiedad esnull
predeterminada. Esto significa que no hay prefijo automático de espacio de nombres. será hecho por Laravel." Documentos de Laravel 8.x: Notas de la versión
Tendría que utilizar el nombre de clase completo para sus controladores cuando haga referencia a ellos en sus rutas cuando no utilice el prefijo de espacio de nombres.
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');
Si prefieres la forma antigua:
App\Providers\RouteServiceProvider
:
public function boot()
{
...
Route::prefix('api')
->middleware('api')
->namespace('App\Http\Controllers') // <---------
->group(base_path('routes/api.php'));
...
}
Haga esto para cualquier grupo de rutas para el que desee un espacio de nombres declarado.
La $namespace
propiedad:
Aunque se menciona una $namespace
propiedad que se establecerá RouteServiceProvider
en las notas de la versión y se comentará en ella, RouteServiceProvider
esto no tiene ningún efecto en sus rutas. Actualmente solo sirve para agregar un prefijo de espacio de nombres para generar URL para acciones. Por lo tanto, puede configurar esta variable, pero por sí sola no agregará estos prefijos de espacio de nombres; aún así deberá asegurarse de usar esta variable al agregar el espacio de nombres a los grupos de rutas.
Esta información se encuentra ahora en la Guía de actualización.
Laravel 8.x Docs - Guía de actualización - Enrutamiento
Con lo que muestra la Guía de actualización, la parte importante es que está definiendo un espacio de nombres en sus grupos de rutas. Configurar la $namespace
variable por sí sola solo ayuda a generar URL para acciones.
Nuevamente, y no puedo enfatizar esto lo suficiente, la parte importante es configurar el espacio de nombres para los grupos de rutas, lo cual sucede que lo hacen al hacer referencia a la variable miembro $namespace
directamente en el ejemplo.
Actualizar:
Si ha instalado una copia nueva de Laravel 8 desde la versión 8.0.2, laravel/laravel
puede descomentar la protected $namespace
variable miembro para RouteServiceProvider
volver a la forma anterior, ya que los grupos de rutas están configurados para usar esta variable miembro para el espacio de nombres de los grupos.
// protected $namespace = 'App\\Http\\Controllers';
La única razón por la que descomentar agregaría el prefijo de espacio de nombres a los controladores asignados a las rutas es porque los grupos de rutas están configurados para usar esta variable como espacio de nombres:
...
->namespace($this->namespace)
...
- Sí, en Laravel 8 ocurre este error.
- Después de probar muchas soluciones obtuve esta solución perfecta.
- Sólo sigue los pasos...
Caso 1
Podemos cambiar dentro api.php
y dentro de web.php
archivos como se muestra a continuación. La forma actual en que escribimos syntax
es
Route::get('login', 'LoginController@login');
Eso debería cambiarse a:
Route::get('login', [LoginController::class, 'login']);
Caso 2
Primero ve al archivo:
app > Providers > RouteServiceProvider.php
En ese archivo reemplace la línea
protected $namespace = null;
conprotected $namespace = 'App\Http\Controllers';
Luego agregue la línea
->namespace($this->namespace)
como se muestra en la imagen...
La forma de definir tus rutas en Laravel 8 es
// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::get('/', [HomeController::class, 'index']);
O
// Using string syntax...
Route::get('/', 'App\Http\Controllers\HomeController@index');
Una ruta de recursos se convierte
// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::resource('/', HomeController::class);
Esto significa que en Laravel 8, no hay ningún prefijo de declaración de controlador automático de forma predeterminada.
Si desea seguir con la forma anterior, debe agregar una propiedad de espacio de nombres
app\Providers\RouteServiceProvider.php
y activarla en el método de rutas.