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
<?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.
<?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.
<?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.
<?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.
<?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.
<?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.
<?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.
<?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.
<?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
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:
<?php
use Kernel\Router\Route;
Route::singleton('products','ProductController');
Ações tratadas e criadas pelo controlador de recursos únicos(singleton)
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”.
<?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