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

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 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:

<?php
/**
* Define the routes for the application.
*
* @param\Illuminate\Routing\Router$router
* @returnvoid
*/
publicfunction 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:

<?php
/**
* Define the routes for the application.
*
* @param\Illuminate\Routing\Router$router
* @returnvoid
*/
publicfunction 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:

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:

<?php
/**
* Define the routes for the application.
*
* @param\Illuminate\Routing\Router$router
* @returnvoid
*/
publicfunction 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','[email protected]');

});

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

  • Flávio Rodrigues

    Interessante para não se perder em milhões de rotas…

  • marcomalaquias

    Interessante, já deu vontade de alterar nos projetos que estou responsável

  • Uhelliton Andrade

    Muito bom!!!