No artigo anterior, vimos Como criar rotas básicas com Laravel, que é muito útil para situações na hora de criar uma página de contato, a pagina sobre a empresa, a página home entre outras. Porém, certamente teremos projetos que precisa ter uma estrutura mais dinâmica como para exibição de noticias por exemplo.
Existem várias formas de se criar rotas dinâmicas com Laravel, dentre elas estão as rotas com parâmetros, rotas com regex e providers, grupos de rotas, entre outras. Aqui mostraremos algumas formas para tornar a navegação do seu site mais dinâmica.
Rotas com parâmetros
A maneira mais simples de se trabalhar com rotas dinâmicas é com o código abaixo, onde nós definimos o nome de um parâmetro, no caso uma variável e alimentamos essa variável com parâmetros adicionados na URL.
No exemplo abaixo estamos apenas exibindo uma mensagem para o usuário de acordo com o que é fornecido pela URL, mas, poderíamos requisitar para a view de noticia.blade.php e nessa view poderíamos fazer a leitura dessa variável para buscar uma informação no banco de dados, por exemplo.
Route::get('/noticia/{slug}', function($slug){ echo 'Minha noticia é: '. $slug; });
Podemos também adicionar mais informações a essa URL como o ID de paginação por exemplo. Nesse caso poderia ficar da seguinte forma.
Route::get('/noticia/{slug}/page/{page}', function($slug, $page){ echo 'Minha noticia é: '. $slug . ' e minha pagina de navegação é: ' . $page; });
Esse tipo de recurso é comum ser utilizado por CMS’s e frameworks para gerir a navegação de conteúdos. Porém, pode ter casos que precisamos condicionar essa informação de entrada para que não haja uma situação indesejada como ao invés do usuário fornecer o nome ou slug de uma matéria ou portal de noticias ele fornecesse um id ou símbolos e números, nesses casos teremos que tratar as informações de modo diferente, e, é ai que entra as rotas com regex e providers.
Rotas com Regex
Supondo que na mesma rota eu possa ter uma entrada de dados com o ID e também possa ser com o nome de uma determinada noticia, ou seja, na mesma URL eu posso fornecer números ou textos, e, cada tipo de dado terá uma tratativa diferente dentro do meu projeto.
Não basta apenas duplicar as rotas e em uma delas colocar o parâmetro ID e na outra colocar o parâmetro slug, pois, dessa forma uma rota ira se sobre por a outra invalidando uma delas. Para esses casos podemos criar rotas condicionadas utilizando expressão regular para identificar que tipo de dado esta sendo inserido para assim, poder realizar a tratativa desejada. Vamos ao exemplo:
Para a rota ser ativada por texto:
Route::get('/noticia/{slug}', function($slug){ echo 'Minha noticia é: '. $slug; })->where('slug', '[a-z]+');
No exemplo acima a rota somente será acessada se o tipo de dados for do tipo texto, devido ao condicionamento que colocamos com o método where, nome da variável e condição.
No exemplo abaixo a rota está condicionada a ser acessada somente quando o tipo de dado de entrada for um número. Vejamos:
Route::get('/noticia/{id}', function($id){ echo 'O ID da noticia é: '. $slug; })->where('id', '[0-9]+');
Sendo assim, utilizamos o mesmo padrão para as duas rotas, mantendo uma navegação coerente porém sendo direcionadas para ações diferentes. Um exemplo de uma situação comum, seria para fazer uma busca de noticias no qual o select no SQL poderia ser diferente para cada tipo de dado.
Rotas com Providers
Dependendo do tamanho do seu projeto pode ser um tanto trabalhoso definir o tipo de dado para cada rota criada. Nesse caso podemos criar uma regra padrão que irá funcionar em todas as rotas, onde, sempre que uma determinada variável for utilizada como parâmetro eu automaticamente identificada qual é o tipo de dado, já atribuindo a condição de identificação correta. Para esses casos podemos criar os Providers, que veremos a seguir:
Ao acessar a pasta app/Providers, você poderá observar que já existem vários providers nativos do Laravel. Dentre eles teremos o RouteServiceProvider.php, nesse arquivo teremos uma classe que agreda diversas informações para as rotas do Laravel.
Para criar um novo padrão (pattern) de rotas no Provider, acesse a função: public function boot(){ // adicione a nova regra aqui}
public function boot(){ Route::pattern('id', '[0-9]+'); ... }
Com isso, sempre que for utilizado a variável id como parâmetro, o Laravel automaticamente irá aplicar o condicionamento para verificar se o tipo de dado é numérico com a comparação com a expressão regular, caso identifique que não se trata de um dado numérico ele irá buscar uma outra rota e se não encontrar nada compatível irá direcionar o usuário para uma pagina de erro pré-definida.