Laravel 8: Cómo arreglar ‘Target class does not exist’

laravel 8

Cómo arreglar ‘Target class does not exist’ en Laravel 8

Laravel 8 se lanzó en Septiembre, 2020 con un montón de nuevas características y cambios. Uno de esos cambios fue la eliminación del espacio de nombres de ruta predeterminado.


Aunque este cambio es compatible con versiones anteriores, lo que significa que los proyectos más antiguos que usaban Laravel 7.x pueden migrar fácilmente a Laravel 8.x sin tener que cambiar nada, los nuevos proyectos creados en Laravel 8 (a partir del 8 de septiembre) deben tener esto en cuenta. .

Muchos desarrolladores se han enfrentado a un problema en sus aplicaciones Laravel 8 recién creadas en las que intentan cargar sus rutas y se encuentran con una excepción que dice algo como:

laravel 8
Tenga en cuenta que es posible que su error no se vea exactamente así

El problema no es que el código esté roto, sino que el 99,9% de los tutoriales de Laravel ahora están rotos en este departamento porque la mayoría de ellos se basaron en este espacio de nombres predeterminado para la sintaxis de la cadena.


El cambio

Hasta Laravel 7, el archivo RouteServiceProvider.php tenía el siguiente código:

laravel 8
RouteServiceProvider.php in Laravel 7.x

Lo que hace esto es decirle a Laravel que cargue las rutas en routes/web.php, usando el middleware web y el espacio de nombres App\Http\Controllers. Esto, a su vez, significa que siempre que declaraste una ruta usando la sintaxis de cadena, Laravel buscaría ese controlador en la carpeta App\Http\Controllers:

laravel 8

En Laravel 8, la variable de $namespace se eliminó y la declaración de Route se cambió a:

laravel 8
RouteServiceProvider.php in Laravel 8.x

Ahora, Laravel está buscando rutas dentro de su archivo web.php, como siempre. También está aplicando el middleware web, como siempre. Pero observe que ya no usa el espacio de nombres anterior.

Esto significa que a partir de Laravel 8, cuando declaras tus rutas usando la sintaxis de cadena, Laravel no buscará tu controlador dentro de App\Http\Controllers.

laravel 8


¿Cómo puedo solucionar esto?

El problema aquí es que Laravel no tiene idea de dónde buscar su controlador, ¡así que todo lo que tenemos que hacer es avisarle! Hay 3 formas de lograr esto:

  • Vuelva a agregar el espacio de nombres manualmente para que pueda usarlo como lo hizo en Laravel 7.xy antes
  • Use el espacio de nombres completo en sus archivos de ruta cuando use la sintaxis de cadena
  • Utilice la sintaxis de acción (recomendado)

Agregar el espacio de nombres manualmente

Esto es bastante simple. Vaya a su archivo RoutesServiceProvider.php y verá lo siguiente:

laravel 8

Todo lo que necesita hacer es agregar las siguientes tres líneas a este archivo y Laravel volverá a usar el espacio de nombres predeterminado como en Laravel 7.x:

laravel 8

¿Qué acabamos de hacer? Declaramos la variable $namespace con el espacio de nombres predeterminado para nuestros controladores y le dijimos a laravel que lo usara para nuestras rutas web y api.

Si intenta ejecutar su aplicación nuevamente, todo debería estar funcionando.

Usando el espacio de nombres completo

Este implica cambiar todas las declaraciones de ruta, pero la idea es simple: anteponga los nombres de sus controladores con su espacio de nombres. Vea el siguiente ejemplo para nuestro PostsController dentro de la carpeta app/Http/Controllers.

laravel 8

Si vuelve a intentarlo, todo debería funcionar sin problemas.

Usar la sintaxis de acción

Esta es la alternativa que recomiendo personalmente, ya que la encuentro más a prueba de errores tipográficos y, en mi experiencia, proporciona un mejor soporte de IDE, ya que le decimos explícitamente al código qué clase usar. En lugar de usar nuestra sintaxis de cadena habitual, podemos usar la sintaxis de acción donde especificamos la clase y el método a usar en una matriz:

Observe que aquí no estamos pasando PostsController entre comillas, sino PostsController::class, que internamente devolverá “App\Http\Controllers\PostsController”. El segundo valor en la matriz es el método para llamar dentro de ese controlador, lo que significa: “En PostsController.php, llame al método” all “.

Nuevamente, si intenta ejecutar su aplicación nuevamente, todo debería estar en funcionamiento.


Palabras de clausura

A estas alturas, su aplicación debería estar funcionando nuevamente. Si no es así, no dude en pedir ayuda. Todos en la comunidad están ansiosos por ayudar.

Ya sea que haya agregado el espacio de nombres manualmente, haya especificado el espacio de nombres completo en sus rutas o haya seguido la sintaxis de la acción, lo que acaba de hacer es decirle a Laravel en qué espacio de nombres se encuentran realmente sus controladores, por lo que ahora sabe dónde buscar.

Si le gustó y quiere aprender más cosas interesantes relacionadas con Laravel, puedes seguir este blog, donde publico sobre codificación, emprendimiento y cómo vivir una vida mejor.

Recent Post