De forma resumida, middleware é uma estrutura posicionada intermediária a outras estruturas, ou seja, liga essas estruturas, permanecendo entre elas. No caso do Laravel, entre requisições do protocolo HTTP. O middleware se posicionará entre as chamadas de requisições, podendo interceptar a comunicação e chamando determinadas ações em sua aplicação.
Requisição -> Middleware -> Requisção/Resposta
Ok, agora que você entendeu o conceito por trás dos middlewares, deve estar se perguntando, qual a utilizade disso no Laravel? Existem diversos casos de aplicação de middlewares, desde autenticação a validação de dados em sua aplicação, os middlewares serão muito úteis. Como exemplo, vamos usar o middleware a seguir, encontrado na Documentação do próprio Laravel:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next) // Como parâmetros recebemos a request disparada pelo usuário, e a próxima requisição da rota
{
if ($request->age <= 200) { // captura o campo "age" recebido na requisição
return redirect('home');
}
return $next($request); // retorna a próxima requisição definida na rota
}
}
Para criar um middleware, utilize o comando em seu terminal:
php artisan make:middleware MeuMiddleware
Seu middleware será criado no diretório:
app/Http/Middleware
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class MeuMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
return $next($request);
}
}
Após criar o arquivo de middleware, precisamos registrá-lo em app/Http/Kernel.php
.
Vamos adicionar nosso middleware na última linha do array $routeMiddleware
, e dar um nome a ele.
// Within App\Http\Kernel Class...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'meumiddleware' => \App\Http\Middleware\MeuMiddleware::class
];
Nosso middleware já está pronto, agora o incluiremos em nossas rotas: Para saber mais sobre rotas no Laravel clique aqui
- Rota única
Route::get('admin/profile', function () {
//
})->middleware('meumiddleware');
use App\Http\Middleware\MeuMiddleware;
Route::get('admin/profile', function () {
//
})->middleware(MeuMiddleware::class); // chamando o middleware
- Grupos
Route::group(['middleware' => ['apiJwt']], function () {
// Rotas
//...
}
É possível específicar a ordem de execução de middlewares em app/Http/Kernel.php
através do array $middlewarePriority
:
protected $middlewarePriority = [
'meumiddleware' => \App\Http\Middleware\MeuMiddleware::class
'outromiddleware' => \App\Http\Middleware\OutroMiddleware::class
];
Middlewares são extremamente úteis em aplicações para diversas implementações, lembrando que é possível colocar diversos middlewares em cadeia para uma mesma rota. Para mais detalhes sobre Middlewares no laravel acesse a Documentação Oficial.