Mudar o namespace dos controllers no Laravel 9

Nas versões antigas do Laravel nós chamávamos os controllers nas rotas da seguinte maneira.

Route::get('/user', 'UserController@index');

Mas perceba que falta ali o namespace, porque se eu deixar assim, o Laravel não vai saber onde pegar esse controller chamado UserController, mas para isso já vem por padrão no arquivo RouteServiceProvider.php a propriedade protected $namespace = 'App\Http\Controllers';

Veja que essa propriedade tem o caminho até a pasta onde estão os controllers, então automaticamente o Laravel usava essa propriedade para carregar os controllers usados no arquivo web.php.

Mas no Laravel 8 essa propriedade veio comentada, então para chamar os controllers da maneira citada acima, eu preciso ir lá no RouteServiceProvider e descomentar essa propriedade $namespace, simples assim, veja como ficou essa classe.

<?php

namespace Illuminate\Foundation\Support\Providers;

use Closure;
use Illuminate\Contracts\Routing\UrlGenerator;
use Illuminate\Routing\Router;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Traits\ForwardsCalls;

/**
 * @mixin \Illuminate\Routing\Router
 */
class RouteServiceProvider extends ServiceProvider
{
  use ForwardsCalls;

  /**
   * The controller namespace for the application.
   *
   * @var string|null
   */
  protected $namespace = 'App\Http\Controllers';

  /**
   * Resto do código 
   *
   */
}

Agora no Laravel 9 a coisa mudou bastante, assa propriedade não está mais lá, mas se você investigar um pouco mais vai ver que elá está na classe pai, também com o nome RouteServiceProvider, então você vai nessa classe e coloca para a propriedade $namespace o caminho(namespace) dos controllers, ficando assim: protected $namespace = 'App\Http\Controllers';

Tem mais uma coisinha que você precisa fazer, que é voltar na classe RouteServiceprovider, não a onde está a propriedade $namespace, e sim na outra, você vai ver que nessa classe tem o método boot, e nesse método boot tem o seguinte.

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

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

            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }

Ali no Route::middleware('web') você coloca a chamada do namespace, ficando assim:

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

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

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

Pronto, agora você já pode chamar os controllers como chamávamos antigamente.


Agora veja a aula que preparei sobre o assunto.


Se quiser conhecer meu trabalho mais a fundo, visite meu canal no YouTube e veja meus cursos completos clicando nos links abaixo.

🔥Canal no YouTube: Ir para o canal no YouTube
🔥Veja meus cursos disponíveis: Ir para a lista de curso

About the Author

Alexandre Eduardo Cardoso
Alexandre Eduardo Cardoso

Meu nome é Alexandre Cardoso e tenho 41 anos. Sou programador desde 2008, quando comecei a estudar e me especializar em PHP e Javascript. Já em 2011, dei minhas primeiras aulas de programação, e não consegui mais parar desde então. Ensinar é minha missão neste mundo!

0 Comments

Leave a comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *