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

7 minutos de lectura

avatar de usuario
Nguyễn Việt Dũng

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.php ruta:

Route::get('register', 'Api\[email protected]');

Cuando golpeo mi register ruta usando Postman, me dio el siguiente error:

Clase objetivo [Api\RegisterController] no existe.

¿Cómo puedo arreglarlo?


Gracias a las respuestas pude solucionarlo. Decidí usar el nombre de clase completamente calificado para esta ruta, pero hay otras opciones como se describe en las respuestas.

Route::get('register', 'App\Http\Controllers\Api\[email protected]');

  • bienvenido a SO .. es su controlador dentro Api carpeta.?

    – Kamlesh Paul

    9 de septiembre de 2020 a las 8:44

  • Necesitas regenerar las clases como composer dump-autoload o en tu RegisterController falta el espacio de nombres.

    – sta

    9 de septiembre de 2020 a las 8:46

  • @KamleshPaul sí

    – Nguyễn Việt Dũng

    9 de septiembre de 2020 a las 8:49

  • entonces intenta composer dump-autoload

    – Kamlesh Paul

    9 sep 2020 a las 8:50

  • Encontré una manera correcta de resolver este problema: scratchcode.io/laravel-8-target-class-controller-does-not-exist

    – Mayank Dudakiya

    07/01/2021 a las 21:35

avatar de usuario
lagbox

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 las rutas.

“En versiones anteriores de Laravel, el RouteServiceProvider contenía un $namespace propiedad. El valor de esta propiedad se prefijaría automáticamente en las definiciones de ruta del controlador y las llamadas al action ayudante / URL::action método. En Laravel 8.x, esta propiedad es null por defecto. Esto significa que Laravel no realizará ningún prefijo de espacio de nombres automático”. Laravel 8.x Docs – Notas de la versión

Tendría que usar el nombre de clase completamente calificado para sus controladores cuando se refiera a ellos en sus rutas cuando no use el prefijo de espacio de nombres.

use App\Http\Controllers\UserController;

Route::get("https://stackoverflow.com/users", [UserController::class, 'index']);
// or
Route::get("https://stackoverflow.com/users", 'App\Http\Controllers\[email protected]');

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.

los $namespace propiedad:

Aunque hay una mención de un $namespace propiedad que se establecerá en su RouteServiceProvider en las notas de la versión y comentado en su RouteServiceProvider esto no tiene ningún efecto en sus rutas. Actualmente es solo 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 debe asegurarse de usar esta variable al agregar el espacio de nombres a los grupos de rutas.

Esta información ahora se encuentra en la Guía de actualización

Laravel 8.x Docs – Guía de actualización – Enrutamiento

Con lo que la Guía de actualización está mostrando el importante parte es que está definiendo un espacio de nombres en sus grupos de rutas. Configuración de la $namespace variable por sí mismo solamente ayuda a generar URL para acciones.

Nuevamente, y no puedo enfatizar esto lo suficiente, el importante parte está configurando el espacio de nombres para los grupos de ruta, lo que simplemente están haciendo 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 de laravel/laravel puedes descomentar el protected $namespace variable miembro en el RouteServiceProvider para volver a la forma anterior, ya que los grupos de ruta están configurados para usar esta variable miembro para el espacio de nombres de los grupos.

// protected $namespace="App\\Http\\Controllers";

los solamente El motivo por el que no se comenta que agregaría el prefijo del espacio de nombres a los controladores asignados a las rutas se debe a que los grupos de rutas están configurados para usar esta variable como espacio de nombres:

...
->namespace($this->namespace)
...

  • Esto realmente me estaba volviendo loco. El comentario sobre la variable $namespace dice: “Si se especifica, este espacio de nombres se aplica automáticamente a las rutas de su controlador”. Bueno, NO lo es. Tienes que agregar ->namespace(‘App\Http\Controllers’) como lo indicaste. Realmente deberían cambiar el comentario en el código fuente…

    – shock_gone_wild

    10 sep 2020 a las 13:35

  • ¿Por qué se cambió la modificación? ¿Para mejorar el rendimiento?

    – CodeGuru

    13 de septiembre de 2020 a las 7:18

  • @WesleySmith a partir de 8.0.2 de laravel/laravel eso está ahí para que usted lo descomente y lo use si lo desea

    – caja de retraso

    24 de septiembre de 2020 a las 0:08

  • @lagbox El mundo es un lugar maravilloso gracias a stackoverflow y gente como tú…

    – Fuego de Dragon

    2 de marzo de 2021 a las 3:21

  • Usted señor/señora/persona es una leyenda. Me gustaría darle una propina de $ 10 de IOTA. Si no sabes lo que es (howtobuyiota.co.uk/que-es-iota). Si lo hace, hágame saber su dirección de recepción.

    – JamesG

    13 de marzo de 2021 a las 11:42

avatar de usuario
Rohit Tagadiya

  • Si en Laravel 8 este error ocurre.
  • Después de probar muchas soluciones, obtuve esta solución perfecta.
  • Solo sigue los pasos…

Caso 1

Podemos cambiar en api.php y en web.php archivos como a continuación. La forma actual en que escribimos syntax es

Route::get('login', '[email protected]');

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 reemplaza la línea
    protected $namespace = null; con protected $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í

  • Respecto al primer caso, qué pasa si tenemos un controlador de recursos. es decir, ¿no hay una función específica para especificar?

    – Berni

    26 sep 2021 a las 17:10

  • Route::resource("proxies", ProxyController::class) falla con el error de clase no encontrada. Usa el espacio de nombres dos veces \App\Http\Controllers\App\Http\Controllers\ProxyController

    – terán

    8 dic 2021 a las 14:49


  • Gracias, esto funciona como magia.

    – Mantener

    10 de enero a las 18:16

avatar de usuario
mobarak hossen

En Laravel 8, solo agrega el espacio de nombres de su controlador en rutas \ web.php

use App\Http\Controllers\InvoiceController; // InvoiceController is controller name

Route::get('invoice',[InvoiceController::class, 'index']);

O ir a: app\Providers\RouteServiceProvider.php ruta y eliminar el comentario:

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

avatar de usuario
Jignesh Joisar

En Laravel 8, el valor predeterminado es eliminar el prefijo del espacio de nombres, por lo que puede configurar la forma anterior en Laravel 7 como:

En RouteServiceProvider.phpagregue esta variable:

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

y actualizar el boot método:

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

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

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

avatar de usuario
harón

La forma de definir tus rutas en Laravel 8 es

// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::get("https://stackoverflow.com/", [HomeController::class, 'index']);

O

// Using string syntax...
Route::get("https://stackoverflow.com/", 'App\Http\Controllers\[email protected]');

Una ruta de recursos se convierte en

// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::resource("https://stackoverflow.com/", HomeController::class);

Esto significa que en Laravel 8, no hay ningún prefijo de declaración de controlador automático por defecto.

Si desea apegarse a la forma anterior, debe agregar una propiedad de espacio de nombres en el
app\Providers\RouteServiceProvider.php y activar en el método de rutas.

avatar de usuario
Pedro Mortensen

Laravel 8 actualizó RouteServiceProvider y afecta las rutas con la sintaxis de cadena. Puede cambiarlo como en las respuestas anteriores, pero la forma recomendada es usar la sintaxis de acción, no usar la ruta con sintaxis de cadena:

Route::get('register', 'Api\[email protected]');

Se debe cambiar a:

Route::get('register', [RegisterController::class, 'register']);

avatar de usuario
Pedro Mortensen

Si está utilizando Laravel 8, simplemente copie y pegue mi código:

use App\Http\Controllers\UserController;

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

¿Ha sido útil esta solución?