Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lukzgois/52d9281452d322c3db6a to your computer and use it in GitHub Desktop.
Save lukzgois/52d9281452d322c3db6a to your computer and use it in GitHub Desktop.
Organizando a aplicação L5 com vários arquivos de rotas

Organizando sua aplicação Laravel com vários arquivos de rotas

Salve galera, como estão vocês?

Estou recriando uma pequena aplicação no meu trabalho no Laravel 5. Ela havia sido escrita na versão 4.2 e agora estou deixando ela mais de acordo com as novidades do framework. Essa aplicação possui uma simples API Rest para listagem e criação de recursos, e eis que resolvi que resolvi organizar melhor as rotas da aplicação e separar as rotas da API em um outro arquivo. É aqui onde nossa história começa…

No amanhecer da versão 5 do Laravel, quando ele ainda se chamava 4.3, eis que um belo dia o arquivo routes.php sumiu. Em seu lugar havia um Service Provider. Houve um pequeno descontentamento da comunidade: era melhor no arquivo, agora preciso escrever o namespace todo, não está mais tão legal, bla bla bla. Então depois o arquivo routes.php retornou ao seu local de origem.

Então o service provider sumiu? Negativo, ele ainda está lá. Não estou mentindo, na pasta app/Providers. Vamos olhar um pequeno trecho dele:

/**
* Define the routes for the application.
*
* @param  \Illuminate\Routing\Router $router
* @return void
*/
public function map(Router $router)
{
    $router->group(['namespace' => $this->namespace], function ($router) {
        require app_path('Http/routes.php');
    });
}

Opa! Mas o que temos ali? Não é um require para nosso arquivo routes.php. Pois sim meu caro amigo, é aqui onde a mágica acontece. O Laravel trás esse service provider por padrão em sua instalação, por isso podemos começar a editar o arquivo de rotas e já ver tudo funcionando. Prático não?

Bom, não precisamos definir o namespace dos nossos controller também graças a essa mágica. Note que o arquivo routes é incluído dentro de um grupo de rotas, que tem o namespace de nossa aplicação. É desse modo que o namespace é resolvido automaticamente. Muita mágica certo?

Pois bem, nosso objetivo aqui é organizar melhor as rotas e controllers de nossa API. Vamos editar um pouco nosso mais novo amigo, o arquivo app/Providers/RouteServiceProvider.php:

/**
* Define the routes for the application.
*
* @param  \Illuminate\Routing\Router $router
* @return void
*/
public function map(Router $router)
{
    $router->group(['namespace' => $this->namespace], function ($router) {
        require app_path('Http/routes.php');
        require app_path('Http/routes_api.php');
    });
}

Agora nossa aplicação também irá ler as rotas definidas no arquivo Http/routes_api.php. Mas podemos melhorar essa organização. Vamos começar criando uma pasta dedicada aos controllers de nossa API:

estrutura de pastas

Temos uma pasta para nossos controller de Api, mas e essa V1 ali? Bom, é para o versionamento da API, caso no futuro algo mude drasticamente no projeto ainda é necessário que a primeira versão esteja disponível, mas isso é uma característica do meu projeto, o importante aqui é entendermos que com isso o namespace de nossos controllers de Api passou a ser outro: App\Http\Controller\Api\V1.

Vamos organizar melhor o nosso service provider para que não seja necessário escrever o namespace completo em cada rota. Para isso iremos criar um novo grupo de rotas com um namespace dedicado:

/**
* Define the routes for the application.
*
* @param  \Illuminate\Routing\Router $router
* @return void
*/
public function map(Router $router)
{
    $router->group(['namespace' => $this->namespace], function ($router) {
        require app_path('Http/routes.php');
    });
    
    $router->group(['namespace' => $this->namespace . '\Api'], 
    function ($router) {
        require app_path('Http/routes_api.php');
    });
}

Muito bem, agora todos os controllers dentro do arquivo routes_api.php irão estar no namespace correto. Mas e o V1? Bom, poderiamos criar um arquivo dedicada para cada versão da API, mas ai já acho muito detalhamento. Então agora vamos trabalhar no nosso arquivo routes_api.php:

<?php

Route::group(['prefix' => 'v1', 'namespace' => 'V1'], function() {

	Route::get('lists', 'ApiController@index');

});

Mágica novamente. O que fizemos foi simplesmente criar um grupo de rotas para nossa V1, utilizando as propriedades prefix e namespace. Note que o namespace é adicionado ao que já estamos definindo no nosso service provider, o que significa que aquele ApiController que ali está será resolvido para o arquivo App\Http\Controllers\Api\V1\ApiController.php. A propriedade prefix irá adicionar um prefixo antes da nossa rota, no caso ficaria assim: myapplication.app\v1\lists

Legal não? Bom, nada impede que as rotas da API fossem criadas no arquivo routes.php mesmo e organizadas utilizando um grupo, mas essa é mais uma abordagem que podemos utilizar em nossos projetos.

Espero que tenham gostado, qualquer dúvida é só deixar nos comentários. Abraços

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment