Como o middleware funciona no Laravel 5?

Estou tentando entender como o middleware funciona em Laravel 5. Eu olhei a Middleware Interface e entendi que devo implementar uma class, que possui um método chamado “handle”. No método “handle”, o fechamento é invocado. Mas eu não entendo, o que deve ser passado no encerramento. Qual class invocará meu Middleware? Como funciona sob o capô? Pode ser que seja como “foreach” e todos os Middlewares serão invocados por turno? UPDATE: Estou tentando implementar meu próprio middleware:

interface Middleware { public function handle($request, Closure $next); } class MiddlewareCollection { private $middlewares; private $request; public function __construct(Array $middlewares, $request) { $this->middlewares = $middlewares; $this->request = $request; } public function run() { $this->next(current($this->middlewares), $this->request); } private function next(Middleware $middleware, $request) { $middleware->handle($request, function($request) { //How can I call the next middleware? }); } } class FirstMiddleware implements Middleware { public function handle($request, Closure $next) { echo $request.'first '; return $next($request); } } class SecondMiddleware implements Middleware { public function handle($request, Closure $next) { echo $request.'second '; return $next($request); } } class ThirdMiddleware implements Middleware { public function handle($request, Closure $next) { echo $request.'third '; return $next($request); } } $middlewares = [ 'first' => new FirstMiddleware(), 'second' => new SecondMiddleware(), 'third' => new ThirdMiddleware() ]; $middlewareCollection = new MiddlewareCollection($middlewares, 'Request'); $middlewareCollection->run(); 

É o caminho certo, ou não? Eu também não consigo entender como devo chamar o próximo middleware no próximo () método na minha class MiddlewareCollection.

Esta publicação no blog é realmente útil para explicar como o middleware funciona e como você pode criar alguns do zero.

No entanto, vou usar um exemplo que é fornecido com o Laravel, o middleware de autenticação ( app/Http/Middleware/Authenticate.php ). Este middleware protege as rotas e garante que o usuário que está tentando acessá-las esteja logado.

 public function handle($request, Closure $next) { if ($this->auth->guest()) { if ($request->ajax()) { return response('Unauthorized.', 401); } else { return redirect()->guest('auth/login'); } } return $next($request); } 

A function de handle é o que faz todo o trabalho para nós, neste caso, ele começa aceitando o $request que é onde queremos ir ou a solicitação que estamos enviando para o servidor.

Em seguida, verificamos se o usuário está logado ou é um convidado com if ($this->auth->guest()) Se estamos logados, isso retornaria falso e nós passaríamos para return $next($request); o que nos permitiria continuar o normal. Se não estamos logados e somos convidados, passamos esta declaração como verdadeira e avançamos com a instrução if .

Então, atingimos:

 if ($request->ajax()) { return response('Unauthorized.', 401); } 

Isso pode ser auto-explicativo, mas verifica se a solicitação é uma chamada ajax e, se for, retornará uma resposta 401 não autorizada.

Se não é uma solicitação do ajax, então atingimos isso:

 else { return redirect()->guest('auth/login'); } 

O que redirectá o convidado para a página de login. Uma vez que eles estão logados, o pedido pode continuar e seu pedido será realizado como normal.

Como tal, eu poderia proteger a rota www.mywebsite.com/admin com este middleware e se eu não estivesse logado, então eu seria redirecionado para www.mywebsite.com/auth/login e uma vez que eu tivesse logado eu retornaria para minha solicitação original www.mywebsite.com/admin sem qualquer problema.

Como mencionei primeiro, confira essa postagem no blog porque tem algumas explicações úteis e exemplos mais simples.

Middleware, em Laravel antes de 5 eram conhecidos como filtros. Middleware intercepta o pedido e, em seguida, processa dentro de sua class middleware é responsável pelo próximo trabalho sobre o que fazer. Existem dois tipos de middleware baseados em como você lida com isso.

O antes do middleware é verificado antes do controle ser passado para o controlador. A lógica está dentro do seu método de manipulação. Como, você quer que você faça o login para publicar no seu livro de visitas. Então, se você usa antes que o middleware seja aplicado, e sua lógica é como

  • verifique se o usuário não está logado
  • redirecione-os de volta para a página de login
  • Caso contrário, deixe o pedido prosseguir como era

e o código será assim,

 public function handle($request, Closure $next) { // Perform action return $next($request); } 

Após as verificações do middleware após o controlador ter concluído todo o trabalho e a resposta será passada para o usuário. Para isso, você pode pensar como uma solicitação de API foi feita e você deseja atualizar o token em cada requisição completa. para isso o código será como,

 public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; } 

Aqui, por simplicidade, você pode pensar o método $ next, pois ele vai passar o controle para o controlador. Para antes do middleware, está verificando a lógica, então vai retornar o controle ao controlador e, finalmente, retornar a resposta.
Por outro lado, o middleware pós é passar o controle para o controlador, quando o controlador finaliza seu trabalho, então algo é armazenado na variável $ response e com alguma lógica. Depois disso, está retornando a resposta $.

Espero que esteja claro agora.