Buscar..
Introducción
Observaciones
Un middleware "Antes" se ejecutará antes del código de acción del controlador; mientras que un middleware "Después" se ejecuta después de que la solicitud maneje la solicitud
Definiendo un middleware
Para definir un nuevo middleware tenemos que crear la clase de middleware:
class AuthenticationMiddleware
{
//this method will execute when the middleware will be triggered
public function handle ( $request, Closure $next )
{
if ( ! Auth::user() )
{
return redirect('login');
}
return $next($request);
}
}
Luego tenemos que registrar el middleware: si el middleware se debe vincular a todas las rutas de la aplicación, debemos agregarlo a la propiedad de middleware de app/Http/Kernel.php
:
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\AuthenticationMiddleware::class
];
mientras que si solo queremos asociar el middleware a algunas de las rutas, podemos agregarlo a $routeMiddleware
//register the middleware as a 'route middleware' giving it the name of 'custom_auth'
protected $routeMiddleware = [
'custom_auth' => \App\Http\Middleware\AuthenticationMiddleware::class
];
y luego enlazarlo a las rutas individuales como esta:
//bind the middleware to the admin_page route, so that it will be executed for that route
Route::get('admin_page', 'AdminController@index')->middleware('custom_auth');
Antes vs Después de Middleware
Un ejemplo de middleware "antes" sería el siguiente:
<?php
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// Perform action
return $next($request);
}
}
mientras que "después" del middleware se vería así:
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
}
La diferencia clave está en cómo se maneja el parámetro $request
. Si las acciones se realizan antes de que $next($request)
ocurra antes de que se ejecute el código del controlador mientras se llama $next($request)
, las acciones se realizarán después de que se ejecute el código del controlador.
Ruta middleware
Cualquier middleware registrado como routeMiddleware
en app/Http/Kernel.php
puede asignarse a una ruta.
Hay algunas formas diferentes de asignar middleware, pero todas hacen lo mismo.
Route::get('/admin', 'AdminController@index')->middleware('auth', 'admin');
Route::get('admin/profile', ['using' => 'AdminController@index', 'middleware' => 'auth']);
Route::get('admin/profile', ['using' => 'AdminController@index', 'middleware' => ['auth', 'admin']);
En todos los ejemplos anteriores, también puede pasar nombres de clase totalmente calificados como middleware, independientemente de si se ha registrado como middleware de ruta.
use App\Http\Middleware\CheckAdmin;
Route::get('/admin', 'AdminController@index')->middleware(CheckAdmin::class);