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