Как работает промежуточное ПО в Laravel 5?

Я пытаюсь понять, как работает промежуточное ПО в Laravel 5. Я посмотрел интерфейс Middleware и понял, что должен реализовать класс, который имеет метод «handle». В методе «handle» вызывается закрытие. Но я не понимаю, что прошло в закрытии. Какой класс будет вызывать мое промежуточное ПО? Как это работает под капотом? Может быть, это похоже на «foreach», и все Middlewares будут вызваны по очереди? UPDATE: Я пытаюсь реализовать свое собственное промежуточное ПО:

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(); 

Это правильно, или нет? Я также не могу понять, как я должен был вызвать следующее промежуточное ПО в методе next () в моем классе MiddlewareCollection.

Это сообщение в блоге действительно полезно для объяснения того, как работает промежуточное программное обеспечение, и как вы можете создавать его с нуля.

Однако я буду использовать пример, который поставляется с Laravel, промежуточным программным обеспечением auth ( app/Http/Middleware/Authenticate.php ). Это промежуточное программное обеспечение защищает маршруты и гарантирует, что пользователь, который пытается получить к ним доступ, вошел в систему.

 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); } 

Функция handle – это то, что делает для нас вся работа, в этом случае она начинается с принятия $request который мы хотим отправиться, или запроса, который мы отправляем на сервер.

Затем мы проверяем, зарегистрирован ли пользователь или является гостем с if ($this->auth->guest()) Если мы вошли в систему, тогда это вернет false, и мы перейдем к return $next($request); что позволило бы нам вести себя как обычно. Если мы не вошли в систему и не являемся гостем, мы передаем это утверждение как истинное и перейдем к утверждению if .

Затем мы ударили:

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

Это может быть самоочевидным, но он проверяет, является ли запрос вызовом ajax, и если он будет тогда, он вернет 401 несанкционированный ответ.

Если это не запрос ajax, мы нажмем на это:

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

Что будет перенаправлять гостя на страницу входа. Как только они будут зарегистрированы в запросе, он может продолжить, и их запрос будет продолжен, как обычно.

Таким образом, я мог бы защитить маршрут www.mywebsite.com/admin с этим промежуточным программным обеспечением, и если бы я не был зарегистрирован, я был бы перенаправлен на www.mywebsite.com/auth/login и как только я войду в систему, я вернусь к моему первоначальному запросу www.mywebsite.com/admin без каких-либо проблем.

Как я уже упоминал, хотя, проверьте это сообщение в блоге, потому что оно имеет некоторые полезные объяснения и более простые примеры.

Middleware, на Laravel до 5, были известны как фильтр. Middleware перехватывает запрос и затем обрабатывает внутри вашего класса промежуточного программного обеспечения, несет ответственность за следующее задание о том, что делать. Существует два типа промежуточного программного обеспечения, основанные на том, как вы справляетесь с этим.

Перед промежуточным программным обеспечением проверяется, прежде чем управление передается контроллеру. Логика находится внутри вашего метода обработки. Например, вы хотите, чтобы вы вошли в свой пост в своей гостевой книге. Итак, если вы используете до применения промежуточного программного обеспечения, и ваша логика подобна

  • проверьте, не был ли пользователь зарегистрирован
  • перенаправить их обратно на страницу входа в систему
  • в противном случае пусть запрос будет выполнен так, как это было

и код будет таким,

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

Послепродажное программное обеспечение проверяет, завершил ли контроллер выполнение всей задачи, и ответ будет передан пользователю. Для этого вы можете думать, что это был запрос API, и вы хотите обновить токен при каждом завершении запроса. для этого будет выглядеть код,

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

Здесь для простоты вы можете думать о методе $ next, поскольку он будет передавать управление контроллеру. Для того, чтобы до промежуточного программного обеспечения он проверял логику, он возвращает управление контроллеру и, наконец, возвращает ответ.
С другой стороны, после промежуточного программного обеспечения передается управление контроллеру, когда контроллер завершает свое задание, тогда что-то сохраняется в переменной $ response и выполняет некоторую логику. После этого он возвращает ответ $.

Надеюсь, теперь это ясно.