Routing

O roteador da aplicação Hello permite o cadastro de rotas que respondem a qualquer verbo HTTP.

Hello disponibiliza 5 verbos de rotas para a sua aplicação: GET, POST, PUT, DELETE e PATCH.

Por padrão, o Hello contém um "ServiceProvider" chamado "CSRF" registrado, que permite a execução apenas de rotas com verbos diferentes de "GET" caso exista um token CSRF válido. As rotas com prefixo "api" serão executadas sem avaliação do token CSRF. Para fornecer o token em um formulário, utilize o helper "csrf_token" para retornar o valor do token válido. Esse token deve ser informado em um campo oculto do formulário (hidden) com o nome "_token". Se você não estiver utilizando um formulário, é possível realizar a requisição da rota protegida por CSRF através de um header com o nome "X-CSRF-TOKEN", usando a mesma lógica do campo oculto.

Lembre-se de que você também pode desativar o "ServiceProvider CSRF", mas isso não é recomendado para uma aplicação em produção. Para rotas de API, recomendamos o uso de JWT por meio de middlewares ou Service Providers.

Rotas básicas

app/Routes/web.php
<?php

use Kernel\Router\Route;

//Cria uma rota "hello" com o verbo GET
 Route::get('hello',function(){ return 'GET - Hello World!'; });
 
 //Cria uma rota "hello" com o verbo POST
 Route::post('hello',function(){ return 'POST'; });
 
 //Cria uma rota "hello" com o verbo PUT
 Route::put('hello',function(){ return 'PUT'; });
 
 //Cria uma rota "hello" com o verbo DELETE
 Route::delete('hello',function(){ return 'DELETE'; });
 
 //Cria uma rota "hello" com o verbo PATCH
 Route::patch('hello',function(){ return 'PATCH'; });

Às vezes, pode ser necessário registrar uma rota que responda a vários verbos HTTP. Você pode fazer isso usando o métodomatch.Ou ainda, você pode registrar uma rota que responda a todos os verbos HTTP usando o métodoany:

Route::match(['get', 'post'], '/', function () {
    // ...
});
 
Route::any('/', function () {
    // ...
});

Às vezes, pode ser necessário personalizar a resposta de "página não encontrada" nos erros 404 para rotas que não foram definidas. Para isso, basta usar o asterisco(*) na declaração do seu roteamento:

Route::get('*',function(){
    return '<h1>Página não encontrada.</h1>';
});

E para a página inicial, ou seja, a index do seu aplicativo, basta usar a barra (/) na declaração do seu roteamento:

Route::get('/',function(){
    return '<h1>Você está na index!</h1>';
});

Rotas com parâmetros

Você pode utilizar a seguinte sintaxe para capturar os parâmetros de rotas "products/{id}". Use o helper "path" para retornar o valor do parâmetro de rota.

app/Routes/web.php
<?php

use Kernel\Router\Route;

 Route::get('products/{id}',function(){
 
    return path('id');
 
 });

Além do helper "path", é possível recuperar o valor de um parâmetro de rota diretamente utilizando a seguinte sintaxe:

 <?php
 
 use Kernel\Router\Route;

 Route::get('products/{id}',function($id){
 
    return $id;
 
 });

Também é possível injetar dependências na sua rota. É possível injetar quantas dependências forem necessários, para isso basta informar na frente da variável o namespace ou o nome da classe, conforme o exemplo abaixo:

 <?php
 use Kernel\Router\Route;
 use Kernel\Http\Request;

 Route::get('rota1',function(Request $request){
 
    return $request->all();
 
 });
 
  Route::get('rota2',function(Kernel\Http\Request $request){
 
    return $request->all();
 
 });
 
  Route::get('rota/{id}',function(Kernel\Http\Request $request,$id){
 
    $request->set('id',$id);
    return $request->all();
 
 });

Rotas com filtros nos parâmetros

Se você desejar que o parâmetro "id" do exemplo anterior seja sempre um valor contendo um número inteiro, você poderá usar o método encadeado "where" que recebe um array associativo onde as chaves são os nomes dos parâmetros da rota e os valores são as expressões regulares.

app/Routes/web.php
<?php

use Kernel\Router\Route;

 Route::get('products/{id}',function(){
 
    return path('id');
 
 })->where(['id'=>'([0-9]+)']);
 
 //Você pode abreviar a ER "([0-9]+)" por "int"

Rotas com middlewares

É possível definir um filtro para uma rota utilizando um middleware. Os middlewares são responsáveis por executar determinadas ações antes ou depois da execução da rota.

app/Routes/web.php
<?php

use Kernel\Router\Route;

 Route::get('products/{id}',function(){
 
    return path('id');
 
 })->middleware(['auth']);

Rotas nomeadas

Também é possível definir um nome ou apelido/alias para a sua rota e acessar a sua rota pelo apelido ou nome fornecido por meio do helper "route". Também é possível passar um segundo parâmetro opcional no helper "route" contendo um array associativo com os valores do parâmetro de rota.

app/Routes/web.php
<?php

use Kernel\Router\Route;

 Route::get('products/{id}',function(){
 
    return route('product',['id'=>20]);
 
 })->name('product');

O helper "route" serve apenas para rotas nomeadas com apelidos/alias, enquanto o helper "url" trará o caminho completo da rota que foi definido no arquivo de roteamento "web.php" ou outro arquivo.

Grupo de rotas

É possível definir um grupo de rotas com middleware e prefixo que serão compartilhados no grupo ao invés de definir rota por rota.

app/Routes/web.php
<?php

use Kernel\Router\Route;

 Route::group(['prefix'=>'api','middleware'=>['jwt']],function(){
 
   Route::get('hello',function(){ return 'GET'; });
   Route::post('hello',function(){ return 'POST'; });
   Route::put('hello',function(){ return 'PUT'; });
   Route::delete('hello',function(){ return 'DELETE'; });
   Route::patch('hello',function(){ return 'PATCH'; });
   
 });

Métodos controladores

É possível chamar um método controlador de uma classe controladora usando a seguinte sintaxe de rota. É obrigatoriamente importante que os métodos chamados estejam com o encapsulamento publico.

app/Routes/web.php
<?php

use Kernel\Router\Route;

Route::get('users','UserController@index');

Você pode usar uma sintaxe alternativa para o código acima:

Route::get('users',[App\Controllers\UserController::class,'index']);

Também é possível usar o operador “@” seguido do nome da pasta do módulo de onde você deseja chamar o método da classe controladora.

app/Routes/web.php
<?php

use Kernel\Router\Route;

Route::get('users','@User/Controllers/UserController@index');

Sintaxe alternativa para chamar um método controlador de uma classe controladora de um módulo.

Route::get('users',[Modules\User\Controllers\UserController::class,'index']);

Controlador de recursos

Você pode usar o método “resources” de rota única para cria várias rotas para lidar com uma variedade de ações no recurso. O controlador gerado já terá métodos para cada uma dessas ações.

app/Routes/web.php
<?php

use Kernel\Router\Route;

Route::resources('products','ProductController');

Sintaxe alternativa:

Route::resources('products',App\Controllers\ProductController::class);

Ações tratadas e criadas pelo controlador de recursos

Verbo
URI/Rota
Ação/Método
Nome da rota

GET

/products

index

products.index

GET

/products/create

create

products.create

POST

/products

store

products.store

GET

/products/{id}

show

products.show

GET

/products/{id}/edit

edit

products.edit

PUT

/products/{id}

update

products.update

DELETE

/products/{id}

destroy

products.destroy

Dica: você pode listar todas as suas rotas definidas na sua aplicação usando o comando de CLI: php hello route:list

Recursos únicos(singleton)

Você pode usar o recurso singleton para registrará as seguintes rotas. Como você pode ver, as rotas de "criação" não são registradas para recursos singleton e as rotas registradas não aceitam um identificador, pois pode existir apenas uma instância do recurso:

app/Routes/web.php
<?php

use Kernel\Router\Route;

Route::singleton('products','ProductController');

Ações tratadas e criadas pelo controlador de recursos únicos(singleton)

Verbo
URI/Rota
Ação/Método
Nome da rota

GET

/products

show

products.show

GET

/products/edit

edit

products.edit

PUT

/products

update

products.update

Controles de recursos diversos(controllers)

É possível definir de uma só vez uma lista de rotas e métodos fornecendo apenas uma classe controladora. A definição é feita por meio de um array associativo, onde as chaves do array são as rotas e os valores do array são os nomes dos métodos controladores. Por padrão ao definir uma rota, ela será criada com o verbo “GET”. Para criar com outro verbo, basta escrever no início do nome o verbo separado por “:”. Por exemplo: “post:teste”.

app/Routes/web.php
<?php

use Kernel\Router\Route;

Route::controllers('ProductController',array(
    'list'=>'show',
    'post:more'=>'createMoreProduct'
));

Atenção: Esse recurso não aceita a sintaxe alternativa.

Last updated