Hace algunos meses, específicamente en septiembre del año pasado Laravel liberaba la versión 8 de su framework con varios cambios sustanciales que, entre otras cosas solidificaron ciertos puntos concretos de la tecnología.

Sin embargo, dentro de dichos cambios, quizá el mas destacable fue el que se hizo en cuanto al sistema de routing se refiere. Entremos en contexto, si has llevas tiempo trabajando con esta tecnología, recordaras que el estándar para creación de rutas era el siguiente:

Route::get('profile', 'ProfileController@index');

Dicho estándar, ha estado incluido en las distintas versiones de Laravel y sorprendió a mas de uno que no funcionase en su nueva versión. La razón de dicho cambio es bastante sencilla. Resulta que el namespace de los controladores fue removido y al crear una aplicación en Laravel 8 debemos indicarlo manualmente en nuestro archivo de rutas para cada controlador.

Definiendo rutas:

Como mencionaba anteriormente, el namespace de los controladores no existe mas (al menos por defecto) para los archivos de rutas de nuestra aplicación, por lo que, siguiendo el nuevo estándar podemos definir nuestras rutas de 4 formas distintas:

Método 1: Llamar directamente a la ubicación del controlador en nuestra ruta.

Llamar a nuestras rutas de esta manera puede resultar la solución mas obvia porque si o si el sistema de rutas apuntara al controlador deseado, sin embargo, aunque hacerlo de esta manera es correcto, se vuelve un proceso tanto verboso y repetitivo.

Route::get("/profiles","App\\Http\\Controllers\\ProfileController@index");

Método 2: Agrupar rutas en grupos regidos por un namespace especifico.

Esta implementación es un tanto mas cómoda, ya que al definir el grupo con el namespace, nuestras rutas subsecuentes adoptaran el aspecto clásico al que estabamos acostumbrados en versiones anteriores del framework.

Route::namespace("App\\Http\\Controllers")->group(function () {
	Route::get("/profiles", "ProfileController@index");
});

Metodo 3: Definir el namespace en el provedor de rutas y seguir utilizando el sistema de routing anterior.

Varios desarrolladores (Conocidos mios mas bien) han decidido que lo mejor para sus desarrollos es “conservar” el antiguo sistema de routing, no porque sea mejor, sino mas bien por mantener de manera homogénea el manejo de este tema en relación con la gestión de proyectos desarrollados en versiones anteriores a la 8, hacer esto es bastante sencillo y a continuación te explicare como hacerlo.

Para empezar vamos a ir a nuestra carpeta de providers en la ruta App/Providers, una vez ahí editaremos el archivo que se llama RouteServiceProvider.php, dentro de este archivo debemos añadir la variable namespace de la siguiente manera:

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

Posteriormente a las metodos Route::middleware se les pasa como parámetro la variable anteriormente creada de la siguiente manera:

->namespace($this->namespace)

Y así de sencillo podemos seguir utilizando el estandar anterior. Si te has perdido en la explicación no te preocupes, tu archivo debió haber quedado de la siguiente manera:

<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
	{
	/**
	* The path to the "home" route for your application.
	*
	* This is used by Laravel authentication to redirect users after login.
	*
	* @var string
	*/
	public const HOME = '/dashboard';
	protected $namespace = "App\\Http\\Controllers"; // <= Agregar aqui
	/**
	* Define your route model bindings, pattern filters, etc.
	*
	* @return void
	*/
	public function boot()
	{
		$this->routes(function () {
		Route::middleware('web')
        ->namespace($this->namespace) // <= Agregar aqui
		->group(base_path('routes/web.php'));
		Route::prefix('api')
		->namespace($this->namespace) // <= Agregar aqui
		->middleware('api')
		->group(base_path('routes/api.php'));
		});
	}
}

Método 4: Implementación sugerida por la documentación oficial.

Si visitas la documentación oficial del framework encontraras la siguiente implementación sugerida donde en la parte superior del archivo de rutas defines la ruta del controlador asi:

use App\Http\Controllers\ProfileController;

Finalmente solo definimos la ruta de la siguiente manera empezando con la ruta de acceso seguida por un array que contendrá nuestro controlador seguido del método a utilizar.

Route::get("/users", [ProfileController::class, "index"]);

Conclusiones.

Aunque a muchos nos tomo por sorpresa el nuevo estándar del sistema de rutas, lo cierto es que trabajarlas de esta manera no es algo nuevo, de hecho en el blog Freek.dev tienen una interesante entrada donde desde el 2019 (aquí) “recomiendan” adecuar el sistema de rutas al nuevo estándar oficial, en cuanto a las ventajas que ofrece trabajar de esta manera honestamente no hay mucho que decir quizá la mas mencionada es que al hacerlo así el IntelliSense en algunos editores (PhpStorm por ejemplo), mejora considerablemente, otra ventaja es que tenemos un mejor control de los Controllers que retornan en rutas, excluyendo a los que ocupamos como repositorios de funciones.

Recuerda que cualquier duda que surja al respecto mis redes sociales están abiertas, por mi parte seria todo y recuerda que si quieres potenciar tu carrera profesional aquí en Codmind encontraras contenido de alta calidad, sin mas que agregar nos vemos la siguiente semana.

¡Hasta pronto!

Referencias.

https://laravel.com/docs/8.x/routing

https://freek.dev/1324-simplifying-controllers#controllers-are-better-off-without-a-default-namespace