Error "El controlador de clase de destino no existe" al usar Laravel 8

Resuelto Nguyễn Việt Dũng asked hace 54 años • 32 respuestas

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:

Ingrese la descripción de la imagen aquí

Mi api.phpruta:

Route::get('register', 'Api\RegisterController@register');

Cuando llegué a mi registerruta 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');
Nguyễn Việt Dũng avatar Jan 01 '70 08:01 Nguyễn Việt Dũng
Aceptado

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 RouteServiceProvideruna $namespacepropiedad. El valor de esta propiedad se antepondría automáticamente a las definiciones de ruta del controlador y a las llamadas al método action/ayudante URL::action. En Laravel 8.x, esta propiedad es nullpredeterminada. 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 $namespacepropiedad:

Aunque se menciona una $namespacepropiedad que se establecerá RouteServiceProvideren las notas de la versión y se comentará en ella, RouteServiceProvideresto 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 $namespacevariable 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 $namespacedirectamente en el ejemplo.

Actualizar:

Si ha instalado una copia nueva de Laravel 8 desde la versión 8.0.2, laravel/laravelpuede descomentar la protected $namespacevariable miembro para RouteServiceProvidervolver 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)
...
lagbox avatar Sep 09 '2020 08:09 lagbox
  • 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.phpy dentro de web.phparchivos como se muestra a continuación. La forma actual en que escribimos syntaxes

Route::get('login', 'LoginController@login');

Eso debería cambiarse a:

Route::get('login', [LoginController::class, 'login']);

Caso 2

  1. Primero ve al archivo:app > Providers > RouteServiceProvider.php

  2. En ese archivo reemplace la línea protected $namespace = null;conprotected $namespace = 'App\Http\Controllers';

    Ingrese la descripción de la imagen aquí

  3. Luego agregue la línea ->namespace($this->namespace)como se muestra en la imagen...

    Ingrese la descripción de la imagen aquí

Rohit Tagadiya avatar Sep 18 '2020 16:09 Rohit Tagadiya

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.phpy activarla en el método de rutas.

Haron avatar Jan 05 '2021 18:01 Haron